`

【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. 友元声明不能位于信号或者槽声明区内.
分享到:
评论

相关推荐

    QT信号与槽.pdf

    ### QT信号与槽详解 #### 一、概述 信号与槽是QT框架中的一项核心机制,对于理解并熟练掌握QT编程至关重要。它提供了一种高效且类型安全的方式来进行对象间的通信,相较于传统的回调函数机制更加灵活和易于管理。...

    QT信号机制.

    ### QT信号机制详解 #### 一、引言 在探讨QT信号机制之前,我们需要明确一个概念,即这里的信号并非指的是Unix/Linux系统中的进程间通信(IPC)中的信号,而是特指图形用户界面(GUI)环境下的一种事件处理机制。...

    Qt信号与槽机制

    Qt信号与槽机制 Qt信号与槽机制是 Qt 编程的核心机制,用于对象之间的通信。信号和槽是一种高级接口,应用于对象之间的通信。信号机制不同于传统的回调函数机制,它提供了一种高效、灵活的方式来实现对象之间的...

    第1章 Qt概述.ppt

    这涉及到了信号和槽机制,是Qt中处理事件和响应的关键概念。 总结来说,Qt是一个功能强大的跨平台开发框架,提供了全面的GUI开发工具和API。Qt 5的安装和使用流程相对简单,Qt Creator和Qt Designer使得GUI设计变得...

    QT经典中文手册.chm

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

    Qt开发教程&案例&相关项目资源.docx

    4. **信号与槽机制**:这是一种独特的事件处理机制,简化了组件间的通信和交互,使代码结构更加清晰、易于维护。 5. **文档和社区支持**:Qt 拥有一套完善的文档体系和活跃的开发者社区,为开发者提供全方位的技术...

    qt试题.doc

    以上内容详尽阐述了QT试题中涉及到的C/C++语言基础、STL的使用以及Qt的相关技术,包括其跨平台特性、信号槽机制、图形界面设计、数据库操作以及事件处理等方面的知识。这些知识点对于开发基于QT的桌面或移动应用至关...

    QT中文参考手册(QT help)

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

    第1章Qt5.pdf

    通过Qt Designer,可以轻松设计和布置UI元素,然后通过编写C++代码连接这些元素的信号和槽,实现功能逻辑。这展示了Qt 5的易用性和灵活性,使得开发者能够在多个平台上快速开发高效的应用程序。

    Qt信号槽使用

    其中,Qt信号槽机制是其核心特性之一,用于对象间的通信。本篇文章将深入探讨Qt信号槽的使用,以及如何在主窗口与子窗口之间传递内容。 首先,理解Qt信号槽的概念。信号是对象在特定事件发生时发出的通知,而槽是...

    QT的信号与槽机制介绍.

    当一个信号被触发时,与之相连的所有槽都会被立即执行,这一过程如同常规函数调用,但在内部是由QT的元对象编译器(Meta Object Compiler, moc)管理,确保了信号的发送和槽的执行符合预期。 信号的声明遵循特定的...

    QT.rarQT资源,经典课件,适合新手!

    3. **信号与槽机制**:这是QT最独特的设计之一。信号与槽机制允许对象之间进行通信,当一个对象的状态发生变化时,可以触发一个信号,其他对象通过连接这个信号并定义槽函数来响应。 4. **QWidgets与QML**:...

    qt-eclipse-c++配置GUI界面编程环境步骤整理.pdf

    - 修改主窗口类头文件,添加信号槽函数声明。 #### 五、总结 通过以上步骤,你可以成功地配置出一个功能完整的Qt GUI编程环境。这不仅能够提高开发效率,还能帮助你更好地理解和掌握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...

    Qt 教程.zip

    Qt中的所有对象都可以通过信号和槽机制进行通信,这是一种异步事件处理机制,使得对象间的交互更加直观和灵活。 **Qt Creator集成开发环境** 为了方便开发,Qt提供了Qt Creator,这是一个功能齐全的集成开发环境...

    一个基于QT实现的简单的WPS软件.zip

    5. **信号与槽机制**:QT的信号和槽机制是其核心特性之一,用于组件间的通信。当特定事件发生时,信号被触发,关联的槽函数被执行。 6. **资源文件**:如`qrc.cpp`,用于管理应用的图标、样式表等资源。 7. **配置和...

    Qt实现的多客户端

    以上就是一个基本的Qt5.8多客户端TCP通信实现概述。实际项目中,可能还需要考虑错误处理、线程安全、并发处理、数据编码与解码等问题。此外,你还可以使用QTcpSocket的其他功能,如设置超时、监控连接状态等,来增强...

    基于qt220的雷达界面设计.doc

    3. 源代码的编辑,通过添加槽函数的内容来实现对按钮等信号的操作。 4. 使用 progen 工具生成工程文件,再使用 tmake 工具生成 Makefile 文件。 5. 修改 Makefile,删除重复项,修改默认的编译器为 arm-linux-g++。 ...

    Qt 开发入门教程.docx

    - 处理事件:利用信号与槽机制处理用户交互事件。 - **调试技巧**: - 使用断点进行调试。 - 查看变量值的变化。 - 分析内存泄漏问题。 #### 六、构建与运行 - **构建应用程序**:在 Qt Creator 中点击“构建...

Global site tag (gtag.js) - Google Analytics