Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1336017
  • 博文数量: 177
  • 博客积分: 3640
  • 博客等级: 中校
  • 技术积分: 1778
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-27 16:51
文章分类

全部博文(177)

文章存档

2014年(1)

2013年(10)

2012年(3)

2011年(163)

分类: LINUX

2011-05-15 12:53:05

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++代码。
阅读(1620) | 评论(0) | 转发(1) |
0

上一篇:Qt中添加背景图片的方法

下一篇:Rect用法

给主人留下些什么吧!~~