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), которые напечатают на поле и метке полученый от сигнала текст.
Итак, мы научились создавать слоты и метки и связывать их между собой.