Qt有两个重要概念:“信号和槽”和“布局”。
Qt用“信号和槽”代替windows编程中的callback机制,通过“信号和槽”来完成不同对象之间的通信,以及完成相应用户的操作,可以用于任何QObject的子类中。
槽和普通的C++成员函数几乎是一样的:可以是虚函数,可以被重载,可以是共有的,保护的或私有的,并且也可以被其他C++成员函数直接调用,参数也可以是任意类型。
不同之处是:槽可以和信号连接在一起,在这种情况下,每当发射这个信号的时候,就会自动调用这个槽。
connect()语句如下:connect(sender,SIGNAL(signal),receiver,SLOT(slot));
这里的sender和receiver是指向QObject的指针,signal和slot是不带参数的函数名,“信号和槽”的一些性质如下:
1.一个信号可以连接多个槽
在发射这个信号的时候,会以不确定的顺序一个接一个地调用这些槽。
2.多个信号可以连接同一个槽
3.一个信号可以与另外一个信号相连接
connect(lineEdit,SIGNAL(textChanged(const QString &)),this,SIGNAL(updateRecord(const QString &)));
当发射第一个信号时,也会发射第二个信号,除此之外,信号与信号的连接,和信号与槽的连接是难以区分的。
4.连接可以被移除
disconnect(...)
5.signal和slot必须有相同的参数类型,如果信号的参数比它所连接的槽的参数多,那么多余的参数将会被简单地忽略掉。如果参数类型不匹配,或在信号和槽的名字中包含了参数名,Qt也会发出警告。
布局:用来管理窗口中窗口部件的几何形状,能对其所负责的窗口部件的尺寸大小和位置进行设置,Qt主要有三种布局管理器类:
QHBoxLayout:在水平方向上排列窗口部件,从左到右。
QVBoxLayout:在竖直方向上排列窗口部件,从上到下。
QGridLayout:把各个窗口部件排列在一个网格中。
emit是Qt中的关键字,它能发射信号,像其他Qt扩展一样,它也会被C++预处理器转换成标准的C++代码。
元对象系统(meta-object system)
Qt的一个最主要的成功是对C++扩展,即把彼此独立的软件模块连接起来,而不需要模块间的任何细节。
这个机制就是Meta-Object系统,它提供了两个关键的用途:信号和槽 与 introspection(内省)。introspection功能允许应用程序在运行时得到QObjec它子类的“meta-information”,这对实现信号和槽是很必要的,包括全部信号和槽的列表,以及类的名字。这个机制还提供了属性(在Qt Designer中使用)和文本翻译(国际化)支持。它们构成了QSA(Qt Script for Application)的基础。
标准C++不提供Qt meta-object系统需要的动态meta-information。Qt提供了一个独立的工具moc,通过定义Q_OBJECT宏实现到C++函数的转变。moc是用纯C++实现的,因此可以使用在任何C++编译器中。
这个机制工作过程如下:
Q_OBJECT声明了一些QObject子类必须实现的内省函数:metaObject(),TR(),qt_metacall()等。
Qt的moc工具实现Q_OBJECT宏声明的函数和所有的信号。
QObject成员函数connect()和disconnect()使用这些内省函数实现信号和槽的连接。
以上这些是通过qmake,moc和QObject自动处理的,程序员通常不用考虑它们。如果你感到对此好奇,可以查看QMetaObject类文档和moc实现的C++代码。
阅读(1617) | 评论(0) | 转发(1) |