Сигналы и слоты в виджетах

Последнее обновление: 06.01.2024

Виджеты 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

В Qt определено множество виджетов, которые имеют различные сигналы. Но мы можем также добавлить и свои сигналы. Например, добавим в проект новый класс C++, который назовем MyWidget. При добавлении класса в проект добавляются заголовочный файл mywidget.h и файл реализации mywidget.cpp

Определение сигналов и слотов в виджетах Qt

В заголовочном файле 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 получит этот сигнал и обработает его:

Сигналы и слоты в кастомных виджетах Qt
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850