Создание своего сигнала

1. Откроем файл mainwindow.h и в класс MainWindow добавим раздел сигналов и прототип сигнала.

signals:

void MySignal(QString);

Эта запись говорит о том, что в классе MainWindow может быть испущен сигнал MySignal с параметром типа QString. У сигналов должен быть прототип, но не должно быть определения т.к. сигнал - это не метод класса. После всех изменений файл mainwindow.h должен выглядеть вот так:

  #ifndef MAINWINDOW_H#define MAINWINDOW_H #include <QMainWindow> namespace Ui {class MainWindow;} class MainWindow: public QMainWindow{ Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~ MainWindow (); private: Ui::MainWindow *ui; public slots: void MyEventHandler(); signals: void MySignal(QString); }; #endif // MAINWINDOW_H

2. Изменим файл mainwindow.cpp. Заменим строчку

ui->lineEdit_2->setText(ui->lineEdit_1->text());

на

emit MySignal(ui->lineEdit_1->text());

Команда emit испускает сигнал MySignal c содержимым поля lineEdit1 в качестве параметра.

3. В конструкторе класса MainWindow вставьте следующие две строки:

QObject::connect(this, SIGNAL(MySignal(QString)), ui->lineEdit_2, SLOT(setText(QString)));

QObject::connect(this, SIGNAL(MySignal(QString)),

ui->labelResult, SLOT(setText(QString)));

Таким образом, мы соединяем наш собственный сигнал MySignal(QString) со слотами сразу двух объектов. После всех изменений файл mainwindow.cpp. должен выглядеть вот так:

  #include "mainwindow.h"#include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow){ ui->setupUi(this); // изменение свойства text объекта labelResult ui->labelResult->setText("Результат!"); QObject::connect(ui->pushButtonCopy, → SIGNAL(clicked()),this, SLOT(MyEventHandler())); QObject::connect(this, SIGNAL(MySignal(QString)),→ ui->lineEdit_2, SLOT(setText(QString))); QObject::connect(this, SIGNAL(MySignal(QString)),→ ui->labelResult, SLOT(setText(QString)));} MainWindow::~ MainWindow (){ delete ui;} // тело слота (т.е. функции обработки сигнала)void MainWindow::MyEventHandler(){ emit MySignal(ui->lineEdit_1->text());}

4. Скомпилируйте и запустите программу.

5. Напишите какой-нибудь текст в поле источник и нажмите на кнопку «Копировать». Содержимое поля источник должно скопироваться в другое поле и в текстовую метку labelResult.

Что же делает программа. При нажатии на кнопку «Копировать» запускается слот void MainWindow::MyEventHandler(), в нем командой emit MySignal(ui->MyLineEdit1->text()) запускается сигнал MySignal(QString) с содержимым поля MyLineEdit1 в качестве параметра. Следующие две строки:

QObject::connect(this, SIGNAL(MySignal(QString)), ui->lineEdit_2, SLOT(setText(QString)));

QObject::connect(this, SIGNAL(MySignal(QString)),

ui->labelResult, SLOT(setText(QString)));

соединяют сигнал MySignal(QString) со слотами setText(QString) сразу двух объектов, поля lineEdit_2 и метки labelResult. При срабатывании сигнала MySignal(QString), содержимое поля lineEdit_1 передастся слотам setText(QString), которые напечатают на поле и метке полученый от сигнала текст.

Итак, мы научились создавать слоты и метки и связывать их между собой.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: