Qt:信号与槽机制
创始人
2024-02-17 16:36:09
0

        说实话,Qt给我的感觉像一种魔改版c++,不纯粹,看不到内部的源代码,也不知道一些宏是怎么实现的...

信号与槽内部机制

        回归正题,其实学过设计模式的应该都能看出来,qt的这个机制是一个观察者模式;

        要实现一个观察者模式最简单的方法就是在信号函数里直接掉用槽机制,发送信号就是调用信号函数,在高级一点,为了拜托信号函数与槽函数的紧耦合,我们可以用函数指针将其解耦;

信号与槽的创建

-:信号与槽的创建都需要类去继承QObject

-:信号需要在定义信号函数前加signals:,其默认是public,不能在其前加上访问权限符号

-:槽需要在其前加上public/private/protected slots: ,与信号创建不同的是其需要在前面加上访问权限符号

-:信号函数只能是声明,不能有定义,定义会自动由moc实现;

-:信号函数返回值只能是void

-:槽函数需要有定义;

-:当发送信号且向其传参时,会将参数按照规则传递给槽函数

信号与槽的关系的创建

-:如果要将信号和槽之间建立联系需要满足以下条件

        ·:信号与槽的参数类型要从左到右一一对应

        ·:信号的参数要>=槽参数的个数,信号的参数传递给槽时,从左到右对应,多余的参数会忽                略

-:建立方式:

-:连接信号和槽需要注意:

        ·:形式1的SINGAL和SLOT宏只是把其中的内容转换为const char*,所以字符串的内容必须与实际函数意义相同,所以并不能用typedef的类型,虽然他们代表的类相同

        ·:由于形式3用的是模板函数,所以并不依赖与上述两个宏,自然也没那么多约束,但两者都有各自的优点和缺点

        ·:形式1无论槽是什么访问权限,都能使用,但是因为形式3的语法限制,只能是public       

        ·:因为语法限制,当槽中的函数被重载时,形式1会有二义性,这个时候我们可以用static_cast<>来解决:

        

测试代码:

#pragma once
#include
#include
class sender :public QObject {Q_OBJECT
signals:void m_sign(int num);
public:explicit sender(QObject* parent = nullptr) {}~sender() {}
};class receiver : public QObject {Q_OBJECT
public slots:void m_slot(int num) {qDebug() << "receiver " << num;}void m_slot() {qDebug() << "receiver ";}
};sender se;
receiver re;
int main(int argc, char *argv[])
{QObject::connect(&se, &sender::m_sign, &re, static_cast(&receiver::m_slot));emit se.m_sign(1);
}

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
苏州离哪个飞机场近(苏州离哪个... 本篇文章极速百科小编给大家谈谈苏州离哪个飞机场近,以及苏州离哪个飞机场近点对应的知识点,希望对各位有...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...