QT信号与槽机制详解

当信号发出后,被连接的槽函数会自动被回调,类似观察者模式,当发生了感兴趣的事件,某一个操作就会被自动触发。信号是由于用户对窗口或控件进行了某些操作,导致窗口或控件产生了某个特定事件,这时Qt对应的窗口类会发出信号以此对用户的挑选做出反应。

信号的本质是事件,按钮单击、双击、窗口刷新、鼠标移动、按下、释放、键盘输入。槽的本质是类的成员函数,其参数可以是任意类型的,槽函数和普通C++成员函数几乎没有区别,可以是虚函数,也可以被重载,可以是公有、保护、 私有的,也可以被其他成员函数调用

唯一区别:槽可以与信号连接一起,每当和槽连接的信号被发射时,就会调用这个槽

在Qt中信号和槽函数都是独立的个体,本身没有任何联系,但由于某种特性需求可以将二者联系,在Qt中使用Qobject类中的connect函数进行关联,一个信号可以连接多个槽,一个槽也可以被多个信号连接,信号可以连接信号,此时前者的发射信号将导致后者的发射,信号的参数类型可以与槽的参数类型对应,信号的参数可以比槽的参数多,但不可以少,否则连接将失败

connect(const Qobject *sender,&QObject::signal, const Qobject *receiver,&QObject::method)

QT5的连接方式:信号和槽函数的参数是函数指针

QT服务器51用8266连,手机用app连,然后数据共享,手机和Qt都能控制单片机,Qt是把单片机的数据发给手机,把手机的控制命令给单片机

sender:发送信号的对象

signal:属于sender对象,信号是一个函数,这个参数的类型是函数指针,信号函数地址

receiver:信号接收者

method属于receiver对象,当检测到sender发出了signal信号,receiver对象调用method方法,信号发出之后的处理动作

sender和receiver两个指针必须被实例化了,否则connect不会成功

使用connect函数相当于做了信号处理动作的注册,method槽函数本质上一个回调函数,调用的时机是信号产生了以后,调用是Qt框架来执行的

connect函数可以有第五个参数第五个参数是连接类型,连接类型(Connection Type):指定信号和槽之间的连接方式,包括:AutoConnection(默认,自动选择最佳连接类型),DirectConnection(直接调用槽函数),QueuedConnection(排队调用槽函数),BlockingQueuedConnection(阻塞式排队调用),以及UniqueConnection(确保信号与槽之间的连接唯一)

一、标准信号与槽:Qt提供的标准类中都可以对某些特定事件进行检测,当用户操作后事件被触发类的内部就会产生对应的信号,这些信号都是Qt类内自带的

QPushButton的信号和槽函数

槽函数在Public slots中,信号函数是在signals中,如果没有signals,可以到基类查找是否有signals

使用:功能实现--点击按钮,窗口

signal\]void QAbstractButton::clicked(bool checked=false)//单击按钮发出的信号 \[slot\]bool QWidget::close()//关闭窗口的槽函数 Connect(ui-\>closewindow,\&QPushButton::clicked,this,\&MainWindow::close); Connect()操作一般写在窗口的构造函数中,相当于在事件产生之前在qt框架中先进行注册 二、自定义信号与槽:需要将信号或槽函数放在一个自定义类中,自定义的类必须继承QObject或QObject的子类,在定义类中头文件加入QBject宏 信号本身是事件,只不过信号对应的函数只有声明,没有定义 自定义信号的要求: 1、信号是类的成员函数 2、返回值是void 3、信号用signals声明 如:class myWindow:public QObject{ Q_OBJECT signals: void mysignal();//信号的参数作用是传递给槽函数 void mysignal(int a); 自定义槽函数:信号的处理动作可以当作普通的成员函数使用,槽函数的参数是用来接收信号传递的数据,信号传递的数据就是信号的参数,信号函数和槽函数的参数类型需要进行匹配 信号函数:void my_slots(int a); 槽函数:void my_signals(int a); 信号的参数可以大于等于槽函数的个数 Public slots: private slots:这样的槽函数不能在类外部调用 Protected slots:不能在类外部调用 Class clock: public Object{ Q_OBJECT; Signals: Void alarn(); } 个人类: Class me: Public Object{ Q_OBJECT; Public slots: Void DO(){ //槽函数 qDebug()<<"起床"; } } QMainWindow类: Class MainWindow:public QMainWindow{ Q_OBJECT; Public: Explicit MainWindow(QWidget *parent=nullptr); ~MainWindow(); Public slots: Void m_trigger(){ c->alarm(); } Private: Ui::MainWindow *ui; me* m; my_clock* c; QMainWindow的构造函数: MainWindow::MainWindow(QWidget *parent): QMainWindow(parent); Ui(new Ui::MainWindow){ Ui->setupUi(this); m=new me; c=new my_clock(); //点击按钮发出的click信号,被QMainWindow接收,触发m_trigger槽函数 //m_trigger槽函数中触发my_clock发送alarm信号 //me接收到alarm信号,触发Do槽函数,打印起床做饭 connect(ui->button,&QPushButton::clicked,this,&MainWindow::m_trigger); connect(c,&my_clock::alarm,m,&me::Do); class Me:QObeject{ Q_OBJECT; Public: void eat(){ qDebug()<<"我要吃面"; } void eat(QString s){ qDebug()<<"我要吃"<

相关推荐
KATA~1 分钟前
解决MyBatis-Plus枚举映射错误:No enum constant问题
java·数据库·mybatis
桃子酱紫君3 分钟前
华为配置篇-BGP实验
开发语言·华为·php
QTX1873015 分钟前
JavaScript 中的原型链与继承
开发语言·javascript·原型模式
xyliiiiiL17 分钟前
一文总结常见项目排查
java·服务器·数据库
shaoing19 分钟前
MySQL 错误 报错:Table ‘performance_schema.session_variables’ Doesn’t Exist
java·开发语言·数据库
The Future is mine1 小时前
Python计算经纬度两点之间距离
开发语言·python
Enti7c1 小时前
HTML5和CSS3的一些特性
开发语言·css3
腥臭腐朽的日子熠熠生辉1 小时前
解决maven失效问题(现象:maven中只有jdk的工具包,没有springboot的包)
java·spring boot·maven
AAA废品回收站陈师傅1 小时前
19信号和槽_信号和槽的基本概念
qt
爱吃巧克力的程序媛1 小时前
在 Qt 创建项目时,Qt Quick Application (Compat) 和 Qt Quick Application
开发语言·qt