qt 槽与信号
来源:互联网 发布:金蛇雾化器做丝数据 编辑:程序博客网 时间:2024/05/07 06:55
槽就是一个可以被调用处理特定信号的函数
一个小的Qt类如下:
class Foo : public QObject { Q_OBJECT public: Foo(); int value() const { return val; } public slots: void setValue( int ); signals: void valueChanged( int ); private: int val; };
Qt中的元对象系统是用来处理对象间通讯的信号/槽机制、运行时的类型信息和动态属性系统。
它基于下列三类:
- QObject类;
- 类声明中的私有段中的Q_OBJECT宏;
- 元对象编译器(moc)。
moc读取C++源文件。如果它发现其中包含一个或多个类的声明中含有Q_OBJECT宏,它就会给含有Q_OBJECT宏的类生成
另一个含有元对象代码的C++源文件。这个生成的源文件可以被类的源文件包含(#include)到或者和这个类的实现一起编译和连接。
除了提供对象间通讯的信号和槽机制之外(介绍这个系统的主要原因),QObject中的元对象代码实现其它特征:
- className()函数在运行的时候以字符串返回类的名称,不需要C++编译器中的本地运行类型信息(RTTI)的支持。
- inherits()函数返回这个对象是否是一个继承于QObject继承树中一个特定类的类的实例。
- tr()和trUtf8() 两个函数是用于国际化中的字符串翻译。
- setProperty()和property()两个函数是用来通过名称动态设置和获得对象属性的。
- metaObject()函数返回这个类所关联的元对象。
虽然你使用QObject作为一个基类而不使用Q_OBJECT宏和元对象代码是可以的,但是如果Q_OBJECT宏没有被使用,
那么这里的信号和槽以及其它特征描述都不会被提供。根据元对象系统的观点,
一个没有元代码的QObject的子类和它含有元对象代码的最近的祖先相同。
举例来说就是,className()将不会返回你的类的实际名称,返回的是它的这个祖先的名称。
强烈建议QObject 的所有子类使用Q_OBJECT宏,而不管它们是否实际使用了信号、槽和属性。
下面是把两个对象连接在一起的一种方法:
Foo a, b; connect(&a, SIGNAL(valueChanged(int)), &b, SLOT(setValue(int))); b.setValue( 11 ); // a == undefined b == 11 a.setValue( 79 ); // a == 79 b == 79 b.value();
调用a.setValue(79)会使a发射一个valueChanged() 信号,b将会在它的setValue()槽中接收这个信号,
也就是b.setValue(79) 被调用。接下来b会发射同样的valueChanged()信号,但是因为没有槽被连接到b的valueChanged()信号,
所以没有发生任何事(信号消失了)。
注意只有当v != val的时候setValue()函数才会设置这个值并且发射信号。
这样就避免了在循环连接的情况下(比如b.valueChanged() 和a.setValue()连接在一起)出现无休止的循环的情况。
- Qt 信号与信号,信号与槽
- qt 槽与信号
- QT信号与槽
- QT 信号与槽
- QT信号与槽
- Qt信号与槽
- Qt信号与槽
- QT信号与槽
- Qt信号与槽
- QT信号与槽
- QT信号与槽
- Qt信号与槽
- Qt信号与槽
- QT 信号与槽
- Qt信号与槽
- QT信号与槽
- qt 信号与槽
- Qt信号与槽
- C# 读写文件
- C# 学习网站
- 各种基本算法实现小结(三)—— 树与二叉树
- 继续谈JAVA虚拟机
- 各种基本算法实现小结(四)—— 图及其遍历
- qt 槽与信号
- SQL 语句学习
- 各种基本算法实现小结(五)—— 排序算法
- VB无所不能之七:VB的多线程(2)
- 视频资源
- 各种基本算法实现小结(六)—— 查找算法
- SQL 语句获取表名列名
- 各种基本算法实现小结(七)—— 常用算法
- 《Windows核心编程》---CAPIHook类