Виджеты 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 получит этот сигнал и обработает его: