Как создать собственный слот в дизайнере qt4? - PullRequest
22 голосов
/ 03 октября 2008

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

Ответы [ 10 ]

29 голосов
/ 06 сентября 2009

Это представляется возможным в версии Qt Designer 4.5.2, но это невозможно сделать из виджета редактора сигналов / слотов в главном окне.

Вот что у меня сработало

  1. Переключение на Редактирование сигналов / слотов * Режим 1009 * (F4)
  2. Перетащите из виджета, который должен излучать сигнал, в виджет, который должен получить сигнал.
  3. A Настройка подключения * Откроется диалоговое окно , показывающее сигналы для отправляющего виджета и слоты для принимающего виджета. Нажмите Изменить ... под столбцом слотов справа.
  4. A Появится диалоговое окно Signals / Slots of ReceivingWidget . Здесь можно щелкнуть значок плюса под слотами, чтобы добавить новый слот с любым именем.
  5. После этого вы можете вернуться и подключиться к новому слоту в диалоговом окне Настроить соединение или же в док-виджете редактора сигналов / слотов в главном окне.

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

28 голосов
/ 22 января 2012

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

4 голосов
/ 09 октября 2012

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

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

public slots:
     void example();

в классе MainWindow.

In MainWindow.cpp

void MainWindow::example() {
     <code>
}
4 голосов
/ 03 октября 2008

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

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

Обсуждается этот вопрос на QtForum

3 голосов
/ 03 октября 2008

Это не представляется возможным простым способом.

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

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

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

2 голосов
/ 14 января 2009

Вы можете использовать магический слот формата

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

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

2 голосов
/ 03 октября 2008

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

2 голосов
/ 03 октября 2008

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

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

1 голос
/ 09 апреля 2011

Может быть, это поможет.

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

0 голосов
/ 31 декабря 2011

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

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

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

вы увидите, что сигнал и слот доступны для редактирования

...