Как создать собственный слот в дизайнере qt4?

Всякий раз, когда я использую диалоговое окно редактора сигналов / слотов, я должен выбирать из существующего списка слотов. Итак, вопрос в том, как мне создать пользовательский именованный слот?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
21
0
34 908
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

Ответ принят как подходящий

К сожалению, в Qt4 это невозможно.

В Qt3 вы могли создавать собственные слоты, которые затем реализовывались в файле ui.h. Однако Qt4 не использует этот файл, поэтому пользовательские слоты не поддерживаются.

Некоторое обсуждение этого вопроса есть на QtForum

Конструктор qt4 поддерживает чтение пользовательских слотов, созданных в формах, портированных из qt3. У меня сложилось впечатление, что его тоже можно создать.

user24560 03.10.2008 15:18

См. Комментарий от raigon ниже, в настоящее время это возможно.

OliJG 31.05.2013 12:44

Кажется, что это просто невозможно.

Дизайнер только позволяет продвигать существующие виджеты в собственные пользовательские виджеты. но он не позволяет подключать сигналы и слоты класса продвигаемых виджетов.

Это возможно путем создания плагина для дизайнера, такого как описано здесь и на следующих за ним страницах.

Обычный способ действий - продвинуть виджет в свой собственный класс, а затем вручную подключить его в своем собственном коде. этот процесс описывается здесь

Это невозможно сделать, потому что это означает, что вы добавили бы слот к существующему классу Qt, например QPushButton, что на самом деле не подходит.

В конечном итоге вы должны создать свой собственный QWidget, создав подкласс существующего. Затем интегрируйте его в Qt Designer как плагин, как было предложено. Наличие собственного класса позволяет вам добавлять / изменять доступные сигналы / слоты по своему усмотрению.

Не забываем про возможность автоподключения слотов. Есть несколько недостатков, например необходимость переименовать свою функцию, если вы переименовываете свой виджет, но мы часто используем их в моей компании.

Вы можете использовать формат волшебного слота

void on_objectName_signal() {
// slot code here, where objectname is the Qt Designer object name
// and the signal is the emission
}

Подключение к этому методу устанавливается методом connectSlotsByName, и всякий раз, когда сигнал испускается, этот слот вызывается.

Кажется, что это возможно в версии Qt Designer 4.5.2, но не могу можно сделать из док-виджета Редактора сигналов / слотов в главном окне.

Это то, что сработало для меня

  1. Перейти в режим Редактировать сигналы / слоты (F4)
  2. Перетащите мышью из виджета, который должен излучать сигнал, на виджет, который должен получить сигнал.
  3. Появится диалоговое окно Настроить соединение, показывающее сигналы для излучающего виджета и слоты для принимающего виджета. Щелкните Редактировать... под столбцом слотов справа.
  4. Появится диалоговое окно Сигналы / слоты ReceivingWidget. Здесь можно щелкнуть значок плюса под слотами, чтобы добавить новый слот с любым именем.
  5. Затем вы можете вернуться и подключиться к своему новому слоту в диалоговом окне Настроить соединение или даже в док-виджете Signal / Slot Editor обратно в главное окно.

Предостережение: я использую PyQt, и я пытался использовать только слоты, добавленные таким образом из Python, а не из C++, поэтому ваш пробег может отличаться ...

Обе кнопки «Изменить ...» в диалоговом окне «Настроить соединение» всегда для меня неактивны.

James 08.11.2009 00:27

Кнопка «Изменить» в «Настроить соединение» неактивна. Как вы ее нажали?

user845459 19.10.2011 22:52

У меня тоже были серые кнопки, но, наконец, я заметил, что если я подключу сигнал к главному окну, я могу добавить слоты, используя метод, указанный здесь. Кажется, работает так, как ожидалось, но это означает, что вы получаете много методов в главном окне, а не в отдельных виджетах.

tom stratton 03.08.2012 05:15

Если кнопка редактирования отключена, возможно, вы неправильно выполнили шаг 2. Когда появится окно «Настроить соединение», посмотрите на имена двух столбцов. Имя правого столбца должно быть владельцем пользовательского слота.

Honest Abe 23.08.2015 02:59

Для всех, кто заходит за пределы Google, в Qt 5 вы должны использовать функцию «продвигать виджет», чтобы сделать виджет в редакторе псевдонимом для настраиваемого класса, прежде чем кнопка «Изменить ...» станет доступной для встроенных. в виджетах, отличных от окна верхнего уровня.

ssokolow 12.09.2016 10:58

Может, это поможет.

По умолчанию вам нужно выбрать из существующего списка слотов. Но вы можете добавить слот, щелкнув правой кнопкой мыши по объекту в списке справа от дизайнера, выбрав «слот / сигналы» и добавив свой собственный слот / сигнал. После этого вы можете выбрать его в редакторе сигналов / слотов.

щелкните виджет правой кнопкой

продвигайте виджет в класс, который вы определили

щелкните виджет правой кнопкой еще раз

вы увидите, что сигнал и слот можно редактировать

Щелкните правой кнопкой мыши в главном окне и выберите «изменить сигналы и слоты» и добавьте новый слот. Он появится в вашем редакторе слотов сигналов.

Я могу это сделать:

В MainWindow.h добавьте строку:

public slots:
     void example();

в классе MainWindow.

В MainWindow.cpp

void MainWindow::example() {
     <code>
}

Другие вопросы по теме