`

【QT】2. 信号/槽之概述

阅读更多
一、对象之间的通讯问题

信号/槽机制是QT的核心机制,信号/槽是一种高级接口,应用于对象之间的通信,它是QT的核心特性,也是QT区别于其它工具包的重要地方。

和QT的信号/槽十分类似的概念是C#中的“委托”(delegate),当然后期发展出来的“委托”,在Microsoft的不懈努力下,更灵活也更容易使用些。

信号/槽或者委托,都是为了解决某些特定场景所设计的:即程序中有某些不可预测的部分,因而无法写死在当前方法中,需要“委托”其他的对象方法加以处理。这样的场景在GUI编程中十分普遍。

信号/槽是QT自行定义的一种通信机制,它独立于标准的C/C++语言,因此要正确的处理信号/槽,必须借助一个称为moc(Meta Object Compiler)的QT工具,该工具是一个C++预处理程序,它为高层次的事件处理自动生成所需要的附加代码。

二、信号

所有从QObject或其子类(例如Qwidget)派生的类都能够包含信号和槽。

/*-----------------------------------------*/
/*		informer.h for QT Signal/SLot	   */
/*-----------------------------------------*/
#pragma once
#include "qobject.h"

class Informer:public QObject
{
	Q_OBJECT;
	public:		
		void notify()
		{
			for(int i=0;i<=10;i++)
			{
				emit send(i);
			}
		};

	signals:
		void send(int status);

};


当对象改变其状态时,信号就由该对象发射(emit)出去,这就是对象所要做的全部事情,它不知道另一端是谁在接收这个信号。

当一个信号被发射时,与其相关联的槽将被立刻执行,就象一个正常的函数调用一样。只有当所有的槽返回以后发射函数(emit)才返回。 如果存在多个槽与某个信号相关联,那么,当这个信号被发射时,这些槽将会一个接一个地 执行,但是它们执行的顺序将会是随机的、不确定的,我们不能人为地指定哪个先执行、哪个后执行。

三、槽

槽用于接收信号,但它们是普通的对象成员函数。一个槽并不知道是否有任何信号与自己相连接。而且,对象并不了解具体的通信机制。
/*-----------------------------------------*/
/*		receiver.h for QT Signal/SLot	   */
/*-----------------------------------------*/
#pragma once
#include "qobject.h"

class Receiver:public QObject
{
	Q_OBJECT;
	private:
		int total;
	public:
		Receiver(){this->total=0;};
	public slots:
		void count(int i)
		{
			printf("Counting: %d+%d=%d\n",this->total,i,this->total+i);
			this->total=this->total+i;
		};

};


槽是普通的成员函数,因此与其它的函数一样,它们也有存取权限。槽的存取权限决定了谁能够与其相关联。同普通的C++成员函数一样,槽函数也分为三种类型,即public slots、private slots和protected slots。
  • public slots:在这个区内声明的槽意味着任何对象都可将信号与之相连接。这对于组件编程非常有用,你可以创建彼此互不了解的对象,将它们的信号与槽进行连接以便信息能够正确的传递。
  • protected slots:在这个区内声明的槽意味着当前类及其子类可以将信号与之相连接。这适用于那些槽,它们是类实现的一部分,但是其界面接口却面向外部。
  • private slots:在这个区内声明的槽意味着只有类自己可以将信号与之相连接。这适用于联系非常紧密的类。


槽也能够声明为虚函数。

四、关联


通过调用QObject对象的connect函数可以将某个对象的信号与另外一个对象的槽函数相关联,这样当发射者发射信号时,接收者的槽函数将被调用。

/*-----------------------------------------*/
/*		main.cpp for QT Signal/SLot	   */
/*-----------------------------------------*/
#pragma once
#include "qobject.h"
#include "informer.h"
#include "receiver.h"

int main(int argc, char* argv[])
{
	Informer *s=new Informer();
	Receiver *r1=new Receiver();
	QObject::connect(s,SIGNAL(send(int)),r1,SLOT(count(int)));
	s->notify();
	delete s,r1;
	return 0;
}


在上面的例子中:Informer的通知事件产生的信号send()和Receiver的count函数相关联。当指定信号signal时必须使用QT的宏SIGNAL(),当指定槽函数时必须使用宏SLOT()。如果发射者与接收者属于同一个对象的话,那么在connect调用中接收者参数可以省略。

五、信号/槽的一些限制
1. 在定义槽函数时一定要注意避免间接形成无限循环,即在槽中再次发射所接收到的同样信号。
2. 宏定义不能用在signal和slot的参数中。
3. 构造函数不能用在signals或者slots声明区域内。
4. 函数指针不能作为信号或槽的参数,如需使用,必须用typedef.
5. 信号与槽不能有缺省参数
6. 信号与槽也不能携带模板类参数,如需使用,必须用typedef.
7. 嵌套的类不能位于信号或槽区域内,也不能有信号或者槽。
8. 友元声明不能位于信号或者槽声明区内.
分享到:
评论

相关推荐

    08_信号与槽1

    1. 概述 2. 信号与槽的关联方式 3. 信号与槽机制的优点 4. 信号与槽机制的效率 5. 信号和槽断开关联 6. Qt 元对象系统 1. 概述 2. 信号

    QT中文参考手册(QT help)

    关于Qt Qt的版本 常见问题解答 Window系统特性注释 如何购买Qt 安装 如何学习Qt ...信号与槽 窗口几何结构 事件和事件过滤器 国际化(i18n) 调试技术 Qt中的线程支持 Qt插件 窗口部件快照

    QT经典中文手册.chm

    信号与槽 窗口几何结构 事件和事件过滤器 国际化(i18n) 调试技术 Qt中的线程支持 Qt插件 窗口部件快照 Trolltech 工具 附录 关于Trolltech公司 如何报告bug 邮件列表信息 所有的工具 Qt设计器 Qt...

    C++课设:校园导游系统,基于qt6.zip

    Qt是一个用标准C++编写的跨平台开发类库,它对标准C++进行了扩展,引入了元对象系统、信号与槽、属性等特性,使应用程序的开发变得更高效。 Qt类库中大量的类以模块形式分类组织的,包括基本模块和扩展模块等。一个...

    黑马程序员Qt全解教程.zip

    1 Qt概述 3 1.1 什么是Qt 3 1.2 Qt的发展史 4 1.3 支持的平台 4 1.4 Qt版本 4 1.5 Qt的安装 5 Linux Host 5 OS X Host 5 Windows Host 5 1.6 Qt的优点 5 2 创建Qt项目 6 2.1 使用向导创建 6 2.2 手动创建 9 2.3 .pro...

    C语言程序设计大作业:学生成绩管理系统代码(Qt).zip

    Qt是一个用标准C++编写的跨平台开发类库,它对标准C++进行了扩展,引入了元对象系统、信号与槽、属性等特性,使应用程序的开发变得更高效。 Qt类库中大量的类以模块形式分类组织的,包括基本模块和扩展模块等。一个...

    QT中文教程

    信号与槽 窗口几何结构 事件和事件过滤器 国际化(i18n) 调试技术 Qt中的线程支持 Qt插件 窗口部件快照 Trolltech 工具 附录 关于Trolltech公司 如何报告bug 邮件列表信息 所有的工具 Qt设计器 Qt...

    Magic ARM 2410

    7.1 Linux 驱动编写概述 .........................305 7.1.1 设备号........................................305 7.1.2 文件层接口................................305 7.1.3 驱动层接口........................

    基于C++ &QT的学生选课系统.zip

    Qt是一个用标准C++编写的跨平台开发类库,它对标准C++进行了扩展,引入了元对象系统、信号与槽、属性等特性,使应用程序的开发变得更高效。 Qt类库中大量的类以模块形式分类组织的,包括基本模块和扩展模块等。一个...

    工资管理系统(基于C++和Qt实现).zip

    Qt是一个用标准C++编写的跨平台开发类库,它对标准C++进行了扩展,引入了元对象系统、信号与槽、属性等特性,使应用程序的开发变得更高效。 Qt类库中大量的类以模块形式分类组织的,包括基本模块和扩展模块等。一个...

    qt必备学习手册初级

    2 创建Qt项目 6 2.1 使用向导创建 6 2.2 手动创建 9 2.3 .pro文件 10 2.4 一个最简单的Qt应用程序 12 3 信号和槽机制 13 3.1 信号和槽 13 3.2 自定义信号槽 15 自定义信号槽需要注意的事项 18 信号槽的更多用法 18 ...

    程序设计作业: p2p聊天系统 qt写的界面 C++实现.zip

    Qt是一个用标准C++编写的跨平台开发类库,它对标准C++进行了扩展,引入了元对象系统、信号与槽、属性等特性,使应用程序的开发变得更高效。 Qt类库中大量的类以模块形式分类组织的,包括基本模块和扩展模块等。一个...

    C++程序设计实践项目——学生信息管理系统,基于Qt+MySQL.zip

    Qt是一个用标准C++编写的跨平台开发类库,它对标准C++进行了扩展,引入了元对象系统、信号与槽、属性等特性,使应用程序的开发变得更高效。 Qt类库中大量的类以模块形式分类组织的,包括基本模块和扩展模块等。一个...

    郭天祥ARM9视频教程(第13和20讲均可观看).docx

    郭天祥ARM9视频教程(第13讲和第...3. 信号和槽机制 4. Qt应用开发实例 第十部分 综合项目实战 第二十四讲 智能网络家居系统制作(后补) 1. 成品演示 2. 制作网页 3. 编写CGI脚本 4. 添加驱动 5. 整体移植 第25讲_77660

    C++课设作业:Qt影院管理系统.zip

    Qt是一个用标准C++编写的跨平台开发类库,它对标准C++进行了扩展,引入了元对象系统、信号与槽、属性等特性,使应用程序的开发变得更高效。 Qt类库中大量的类以模块形式分类组织的,包括基本模块和扩展模块等。一个...

    qt-signal-slot:使用信号和槽将 QML 连接到 C++

    连接 Qt QML 和 C++概述该程序演示了如何通过 Qt 信号和槽连接 QML 和 C++。 它通过在 QML 中嵌入 C++ 代码作为上下文属性而不是显式连接信号和槽来实现这一点。 当程序启动时,C++ 部分向 QML 发送一个信号,包括一...

    基于AMR6818的车载系统,功能有天气预报、视频播放、音乐播放、计时器,编辑环境及语言:Qt和C++.zip

    Qt是一个用标准C++编写的跨平台开发类库,它对标准C++进行了扩展,引入了元对象系统、信号与槽、属性等特性,使应用程序的开发变得更高效。 Qt类库中大量的类以模块形式分类组织的,包括基本模块和扩展模块等。一个...

    毕业设计项目:校园导航系统 QT界面+TSP(模拟退火)+A star寻路+最少换乘+单车调度(最小费用最大流)等.zip

    Qt是一个用标准C++编写的跨平台开发类库,它对标准C++进行了扩展,引入了元对象系统、信号与槽、属性等特性,使应用程序的开发变得更高效。 Qt类库中大量的类以模块形式分类组织的,包括基本模块和扩展模块等。一个...

    基于C++和 Qt 的影院票务系统.zip

    Qt是一个用标准C++编写的跨平台开发类库,它对标准C++进行了扩展,引入了元对象系统、信号与槽、属性等特性,使应用程序的开发变得更高效。 Qt类库中大量的类以模块形式分类组织的,包括基本模块和扩展模块等。一个...

    基于MySQL和Qt的医疗预约系统.zip

    Qt是一个用标准C++编写的跨平台开发类库,它对标准C++进行了扩展,引入了元对象系统、信号与槽、属性等特性,使应用程序的开发变得更高效。 Qt类库中大量的类以模块形式分类组织的,包括基本模块和扩展模块等。一个...

Global site tag (gtag.js) - Google Analytics