1. Обзор сигналов и слотов
Сигналы и слоты — один из гордых механизмов фреймворка Qt. Так называемый сигнальный слот на самом деле является режимом наблюдателя (режим публикации-подписки). Когда происходит «событие», например, кнопка обнаруживает, что на нее нажали, она посылает сигнал (сигнал). Эта эмиссия бесцельна, аналогична радиовещанию. Если объект заинтересован в этом сигнале, он будет использовать функцию подключения, что означает привязку сигнала, который он хочет обработать, к собственной функции (называемой слотом) для обработки этого сигнала. То есть, когда сигнал отправлен, функция подключенного слота будет вызвана автоматически. Это похоже на шаблон наблюдателя: когда происходит интересующее событие, действие запускается автоматически.
1.1 Характер сигнала
Сигнал возникает из-за того, что пользователь выполняет некоторые операции с окном или элементом управления, что приводит к тому, что окно или элемент управления генерируют определенное событие.В это время соответствующий класс окна Qt отправит определенный сигнал в ответ на выбор пользователя.
Следовательно, по вышеприведенному описанию можно сделать вывод: сущностью сигнала является событие, такое как:
- щелчок кнопки, двойной щелчок
- обновление окна
- движение мыши, нажатие мыши, отпускание мыши
- ввод с клавиатуры
Итак, в какой форме сигнал представляется пользователю в Qt?
- С каким окном мы работаем, какое окно может захватывать эти инициированные события.
- Для пользователей, когда событие запускается, мы можем получить определенный сигнал, отправленный нам инфраструктурой Qt.
- Форма представления сигнала — это функция, то есть, когда происходит событие, среда Qt вызывает соответствующую сигнальную функцию, чтобы уведомить пользователя.
Отправитель сигнала в QT является экземпляром объекта класса, и связанные события могут быть обнаружены внутри объекта.
1.2 Природа слотов
В Qt слот-функция — это специальная функция-функция, которую также можно использовать как обычную функцию-член класса в процессе кодирования. Причина, по которой они называются слот-функциями, заключается в том, что они также должны обрабатывать сигналы, сгенерированные в среде Qt.
Чтобы привести простой пример:
Моя девушка сказала: «Я голодна!», и я пригласил ее на ужин.
В приведенном выше примере подруга отправила сигнал, а я получил сигнал и обработал его.
- Подруга-> человек, подавший сигнал, содержание сигнала: я голоден
- I -> объект, получивший сигнал и обработавший сигнал, действие обработки: взять ее поесть
Владелец функции слота в Qt также является экземпляром объекта определенного класса.
1.3 Связь между сигналами и слотами
В Qt сигнальная и слотовая функции являются независимыми индивидуумами, не имеющими никакой связи сами по себе, но из-за определенных требований к характеристикам мы можем соединить их вместе, что эквивалентно связыванию. Класс QOjbect Функция вступает в ассоциацию между ними.
QMetaObject::Connection QObject::connect(
const QObject *sender, PointerToMemberFunction signal,
const QObject *receiver, PointerToMemberFunction method,
Qt::ConnectionType type = Qt::AutoConnection);
- 参数:
- sender: 发出信号的对象
- signal: 属于sender对象, 信号是一个函数, 这个参数的类型是函数指针, 信号函数地址
- receiver: 信号接收者
- method: 属于receiver对象, 当检测到sender发出了signal信号,
receiver对象调用method方法,信号发出之后的处理动作
// connect函数相对于做了信号处理动作的注册
// 调用conenct函数的sender对象的信号并没有产生, 因此receiver对象的method也不会被调用
// method槽函数本质是一个回调函数, 调用的时机是信号产生之后, 调用是Qt框架来执行的
// connect中的sender和recever两个指针必须被实例化了, 否则conenct不会成功
connect(const QObject *sender, &QObject::signal,
const QObject *receiver, &QObject::method);
1.4 Углубить понимание с помощью примеров
Теперь, чтобы реализовать простую функцию, скажем, создать кнопку, нажмите эту кнопку, чтобы закрыть окно.
Затем подумайте об отправителе сигнала этой функции, получателе сигнала, какой сигнал отправить и что делать после получения сигнала.
- Кнопка: отправитель -> QPushButton
- Окно: приемник и обработчик сигнала -> QWidget
- Сигнал: кликнули -> кликнули
- Функция слота, то есть как обращаться -> закрыть
Теперь давайте реализуем
Добавьте в пользовательский интерфейс кнопку с именем closeBtn.
Затем в файле Mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(ui->closeBtn,&QPushButton::clicked,this,&MainWindow::close);
}
MainWindow::~MainWindow()
{
delete ui;
}
Обратите внимание на этот оператор
connect(ui->closeBtn,&QPushButton::clicked,this,&MainWindow::close);
через этот оператор для достижения привязки
Теперь давайте побежим
Нажмите на кнопку и окно закроется
Преимущества этой статьи: бесплатный пакет учебных материалов по разработке Qt, техническое видео, в том числе (основа языка C++, шаблон проектирования C++, введение в программирование Qt, механизм сигналов и слотов QT, рисование изображений для разработки интерфейса QT, сеть QT, QT программирование базы данных, реальный бой проекта QT, QSS, OpenCV, быстрый модуль, вопросы для интервью и т. д.) ↓↓↓↓↓↓См .