Как подключить сигналы и слоты Qt с помощью QT Designer и Visual Studio

#c #qt

#c #qt

Вопрос:

Я использую Qt Designer для разработки своего приложения, которое содержит «Файл загрузки» QPushButton (который был повышен до пользовательского loadfile.h ), а также QOpenGLWidget (который был повышен до пользовательского OGLWidget.h ).

Я хотел сделать так, чтобы при нажатии кнопки «Загрузить файл» он отправлял сигнал на слот в моем OGLWidget классе, который вызывал диалог и загружал файл.

Я начал с перехода в режим редактирования сигналов / слотов в Qt Designer и подключил кнопку openglwidget с clicked() помощью в качестве сигнала и недавно добавленной (из Qt Designer) populate_mesh_from_obj() .

Затем я создал функцию:

 void OGLWidget::populate_mesh_from_obj()
{
    exit(0);
}
  

в качестве теста и в заголовке помещается:

 public slots:
   void populate_mesh_from_obj();
  

Теперь в моей голове я подумал:

  1. Сигнал clicked() уже реализован Qt magic
  2. Слот был реализован мной
  3. Qt Designer где-то их подключил

Так что для меня это должно было сработать. Есть идеи, почему этого не произошло?

Ответ №1:

вы должны подключить их вручную..

 connect(ui->button, amp;QPushButton::clicked, yourGlPointer, amp;OGLWidget::populate_mesh_from_obj);
  

Ответ №2:

К счастью, принятый ответ неверен (дело не в том, что он не работает вручную, но вам не обязательно делать это таким образом).

Фактически, QT автоматически подключит сигнал ко всем слотам, которые соответствуют стандартному соглашению об именовании.

Это соглашение об именовании слотов выглядит следующим образом:

 void on_<object name>_<signal name>(<signal parameters>);
  

В вашем случае это означает, что если вы создали QPushButton в QT Designer следующим образом:

QPushButton загружает файл

это object name loadfile и есть имя сигнала clicked .

Теперь объявите свою функцию следующим образом в заголовке:

 public slots:
   void on_loadfile_clicked();
  

и определите это так в cpp:

 void OGLWidget::on_loadfile_clicked()
{
    exit(0);
}
  

и о подключении позаботятся автоматически.

Эта функция автоматического подключения фактически реализована с помощью компилятора метаобъектов QT. Вы можете повторить, что происходит, открыв ui_<classname>.h файл, созданный QT Designer. Он будет содержать функцию void setupUi(<QClassName> *<YourClassName>) , содержащую строку QMetaObject::connectSlotsByName(<YourClassName>); . Это то, что инструктирует компилятор метаобъектов QTs реализовать соединения для вас.