Виджеты Qt наследуется в конечном счете от класса QObject и могут определять и определяют сигналы и слоты. Например, возьмем следующее простейшее приложение:
#include <QApplication> #include <QWidget> #include <QPushButton> #include <QMessageBox> void onClick(); int main(int argc, char *argv[]) { QApplication app(argc, argv); QWidget widget; widget.setMinimumSize(250, 150); widget.setWindowTitle("METANIT.COM"); QPushButton btn{"Click", &widget}; // устанавливаем для события clicked обработчик onClick QObject::connect(&btn, &QPushButton::clicked, onClick); widget.show(); return app.exec(); } // обработчик нажатия void onClick() { QMessageBox msgBox; // диалоговое окно msgBox.setText("Button Clicked!"); // устанавливаем текст msgBox.exec(); // отображаем диалоговое окно }
Здесь виджетом верхнего уровня (окном приложения) является объект типа QWidget, который содержит кнопку QPushButton. Для кнопок по умолчанию определен ряд сигналов, из который самый используемый - сигнал clicked, вызываемый при нажатии кнопки. И в данном случае данный сигнал соединяется с функцией-обработчиком onClick:
QObject::connect(&btn, &QPushButton::clicked, onClick);
Таким образом, при нажатии на кнопку будет генерироваться сигнал clicked. Функция onClick получит этот сигнал и отобразит окно с сообщением.
В Qt определено множество виджетов, которые имеют различные сигналы. Но мы можем также добавлить и свои сигналы. Например, добавим в проект новый класс C++, который назовем MyWidget. При добавлении класса в проект добавляются заголовочный файл mywidget.h и файл реализации mywidget.cpp
В заголовочном файле mywidget.h определим следующий код:
#ifndef MYWIDGET_H #define MYWIDGET_H #include <QWidget> #include <QPushButton> class MyWidget : public QWidget { Q_OBJECT public: MyWidget(QWidget *parent = nullptr); signals: void widgetClicked(); private: QPushButton *myButton; }; #endif // MYWIDGET_H
Данный класс представляет виджет и унаследован от класса QWidget. В этом виджете определена кнопка QPushButton и сигнал widgetClicked.
В файле mywidget.cpp определим следующую реализацию виджета:
#include "mywidget.h" MyWidget::MyWidget(QWidget *parent) : QWidget(parent) { myButton = new QPushButton("Click Me", this); setMinimumSize(250, 150); setWindowTitle("METANIT.COM"); // перенаправляем сигнал clicked кнопки на сигнал widgetClicked connect(myButton, &QPushButton::clicked, this, &MyWidget::widgetClicked); }
Здесь определяется конструктор виджета, в котором создается кнопка и настраиваются минимальный размер и заголовок виджета.
Кроме того, здесь перенаправляется сигнал нажатия кнопки на сигнал виджета widgetClicked.
Используем виджет в файле main.cpp:
#include <QApplication> #include <QMessageBox> #include "mywidget.h" void onClick(); int main(int argc, char *argv[]) { QApplication app(argc, argv); MyWidget widget{}; // устанавливаем для события clicked обработчик onClick QObject::connect(&widget, &MyWidget::widgetClicked, onClick); widget.show(); return app.exec(); } // обработчик нажатия void onClick() { QMessageBox msgBox; // диалоговое окно msgBox.setText("Widget Clicked!"); // устанавливаем текст msgBox.exec(); // отображаем диалоговое окно }
В данном случае функция onClick обрабатывает сигнал widgetClicked. И при нажатии на кнопку произойдет перенаправление сигнала clicked кнопки на сигнал widgetClicked. Функция onClick получит этот сигнал и обработает его: