Что такое механизм сигнального слота Qt

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, быстрый модуль, вопросы для интервью и т. д.) ↓↓↓↓↓↓См .

Guess you like

Origin blog.csdn.net/m0_73443478/article/details/130426434