Читать книгу 📗 "Основы программирования в Linux - Мэтью Нейл"
На способы применения сигналов и слотов в Qt есть несколько ограничений, но они не слишком существенные:
□ сигналы и слоты должны быть функциями-методами класса-потомка
QObject□ при использовании множественного наследования
QObject□ оператор
Q_OBJECT□ сигналы нельзя применять в шаблонах;
□ указатели на функцию не могут использоваться как аргументы в сигналах и слотах;
□ сигналы и слоты не могут переопределяться или обновляться до статуса
publicПоскольку вы должны писать ваши сигналы и слоты как потомков объекта
QObjectQWidgetQObjectQMainWindowТипичное определение класса в файле MyWindow.h для вашего GUI будет напоминать приведенное далее:
class MyWindow : public QMainWindow { Q_OBJECTpublic: MyWindow(); virtual ~MyWindow();signals: void aSignal();private slots: void doSomething();}Ваш класс — наследник объекта
QMainWindowQDialogQ_OBJECTУ вас есть один сигнал и один слот, оба без параметров. Для порождения сигнала
aSignal()emitemit aSignal();Это означает, что все остальное обрабатывается Qt. Вам даже не потребуется реализация
aSignal()Для применения слотов их нужно связать с сигналом. Делается это соответствующим образом с помощью названного статического метода
connectQObject<b>bool QObject::connect(const QObject * sender, const char* signal,</b><b> const QObject * receiver, const char * member);</b>Просто передайте объект, владеющий сигналом (отправитель), функцию сигнала, объект, владеющий слотом (приемником), и в завершение укажите имя слота.
В примере MyWindow, если бы вы захотели связать сигнал
clickedQPushButtondoSomethingconnect(button, SIGNAL(clicked()), this, SLOT(doSomething()));Учтите, что необходимо применять макросы
SIGNALSLOTFALSEОстается реализовать ваш слот в виде обычной функции-метода:
void MyWindow::doSomething() { // Код слота}Выполните упражнение 17.2.
Теперь, зная основы использования сигналов и слотов, применим их в примере. Усовершенствуйте
QMainWindowclicked1. Введите следующее объявление класса и назовите файл ButtonWindow.h:
#include <qmainwindow.h>class ButtonWindow : public QMainWindow { Q_OBJECTpublic: ButtonWindow(QWidget *parent = 0, const char *name = 0); virtual ~ButtonWindow();private slots: void Clicked();};2. Далее следует реализация класса в файле ButtonWindow.cpp:
#include "ButtonWindow.moc"#include <qpushbutton.h>#include <qapplication.h>#include <iostream>3. В конструкторе вы задаете заголовок окна, создаете кнопку и связываете сигнал нажатия кнопки с вашим слотом.
setCaptionQMainWindowButtonWindow::ButtonWindow(QWidget *parent, const char* name) : QMainWindow(parent, name) { this->setCaption("This is the window Title"); QPushButton *button = new QPushButton("Click Me!", this, "Button1"); button->setGeometry(50, 30, 70, 20); connect(button, SIGNAL(clicked()), this, SLOT(Clicked()));}4. Qt автоматически удаляет виджеты, поэтому ваш деструктор пуст:
ButtonWindow::~ButtonWindow() {}5. Затем реализация слота:
void ButtonWindow::Clicked(void) { std::cout << "clicked!n";}6. И наконец, в функции
mainButtonWindowint main(int argc, char **argv) { QApplication app(argc, argv); ButtonWindow *window = new ButtonWindow();