Генерация сигнала из программы

В некоторых случаях необходимо вызвать сигнал из программы. Например, при заполнении последнего текстового поля и нажатии клавиши <Enter> можно имитировать нажатие кнопки и тем самым запустить обработчик этого сигнала. Выполнить генерацию сигнала из программы позволяет инструкция emit. Формат инструкции:

emit [Объект->]<Сигнал>([<Данные через запятую>])

Пользовательские сигналы должны объявляться внутри секцией signals в объявлении класса. Методы сигналов никогда не возвращают значения и не требуют создания определения. Пример:

signals:
   void mysignal(int, int);

В качестве примера создадим окно с двумя кнопками. Для этих кнопок назначим обработчики сигнала clicked() (нажатие кнопки). Внутри обработчика щелчка на первой кнопке сгенерируем два сигнала. Первый сигнал будет имитировать нажатие второй кнопки, а второй сигнал будет пользовательским. Внутри обработчиков выведем сообщения в окно консоли. Содержимое файла widget.h приведено в листинге 4.9, файла widget.cpp — в листинге 4.10, а файла main.cpp — в листинге 4.11.

Листинг 4.9. Содержимое файла widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QVBoxLayout>

class Widget : public QWidget
{
   Q_OBJECT

public:
   Widget(QWidget *parent=nullptr);
   ~Widget();
signals:
   void mysignal(int, int);
private slots:
   void on_btn1_clicked();
   void on_btn2_clicked();
   void on_mysignal(int, int);
private:
   QPushButton *btn1;
   QPushButton *btn2;
   QVBoxLayout *vbox;
};
#endif // WIDGET_H

Листинг 4.10. Содержимое файла widget.cpp

#include "widget.h"

Widget::Widget(QWidget *parent)
   : QWidget(parent)
{
   btn1 = new QPushButton("Нажми меня");
   btn2 = new QPushButton("Кнопка 2");
   vbox = new QVBoxLayout();
   vbox->addWidget(btn1);
   vbox->addWidget(btn2);
   setLayout(vbox);
   connect(btn1, SIGNAL(clicked()),
           this, SLOT(on_btn1_clicked()));
   connect(btn2, SIGNAL(clicked()),
           this, SLOT(on_btn2_clicked()));
   connect(this, SIGNAL(mysignal(int,int)),
           this, SLOT(on_mysignal(int,int)));
}

void Widget::on_btn1_clicked()
{
   qDebug() << "Нажата кнопка 1";
   // Генерируем сигналы
   emit btn2->clicked();
   emit mysignal(10, 20);
}

void Widget::on_btn2_clicked()
{
   qDebug() << "Нажата кнопка 2";
}

void Widget::on_mysignal(int a, int b)
{
   qDebug() << "on_mysignal" << a << b;
}

Widget::~Widget() {}

Листинг 4.11. Содержимое файла main.cpp

#include "widget.h"

int main(int argc, char *argv[])
{
   QApplication app(argc, argv);
   Widget window;
   window.setWindowTitle("Генерация сигнала из программы");
   window.resize(350, 150);
   window.show();
   return app.exec();
}

Результат выполнения после нажатия первой кнопки:

Нажата кнопка 1
Нажата кнопка 2
on_mysignal 10 20

Сгенерировать сигнал можно не только с помощью emit. Некоторые компоненты предоставляют методы, которые посылают сигнал. Например, у кнопок существует метод click(). Используя этот метод инструкцию:

emit btn2->clicked();

можно записать следующим образом:

btn2->click();

Более подробно такие методы мы будем рассматривать при изучении конкретных компонентов.

Учебник C++ (Qt Creator и MinGW)
Учебник C++ (Qt Creator и MinGW) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов