没有合适的资源?快使用搜索试试~ 我知道了~
Qt应用程序的编程核心技术
4星 · 超过85%的资源 需积分: 9 42 下载量 190 浏览量
2010-08-12
12:45:16
上传
评论
收藏 669KB DOC 举报
温馨提示
试读
64页
Qt/X11与Qt/Embedded版本的Qt类库,尽管类的底层实现有一些细微区别,但类的声明及方法函数是一样的,对于编写Qt应用程序的编程者来说,几乎不需要关心这些区别,使用的类与方法函数接口是一样的。本章介绍了Qt对象模型、国际化方法、元对象及代码生成、进程间通信、窗口部件的基类、模板库和集合类、Qt线程、鼠标拖放、键盘焦点、会话管理、调试等方面技术。
资源推荐
资源详情
资源评论
与 版本的 类库,尽管类的底层实现有一些细微区别,但类的声
明及方法函数是一样的,对于编写 应用程序的编程者来说,几乎不需要关心这些区别,
使用的类与方法函数接口是一样的。本章介绍了 对象模型、国际化方法、元对象及代码
生成、进程间通信、窗口部件的基类、模板库和集合类、 线程、鼠标拖放、键盘焦点、
会话管理、调试等方面技术。
1 Qt 概述
是一个跨平台的 图形用户界面库,由挪威 公司出品,目前包括
, 基 于 的 , 快 速 开 发 工 具 , 国 际 化 工 具
等, 支持 系统及 ,还支持 ! "#, $%$& 平台。 的良好
封装机制使得 的模块化程度非常高,可重用性较好,对于用户开发来说是非常方便的。
'() 和开发工具对所有支持平台都是一致的,从而可以进行独立于平台的程序开发和配
置。它使得跨平台软件编程直观、简易和方便。提供了一种称为 的安全类
型来替代# 回调函数,这使得各个控件之间的协同工作变得十分简单。
在 下有 *( 版,可方便用户的学习及开发。如果用户使用,对库的稳定
性,健壮性要求比较高,并且希望跨平台开发的话,那么使用 是较好的选择, 还支
持"+ 图形渲染、,-*、. 等。
/-'--0/'1是 的跨平台脚本工具箱。 为静态的
程序提供了一个脚本界面,可以定制和扩展程序。
- 是为基于 的 (',智能电话和其他移动设备设计的一个全面的,可以用
户化的应用程序平台和用户界面。
是面向嵌入式系统的 版本,是 的嵌入式 窗口,是完整的自包
含 *) 和基于 的嵌入式平台开发工具。'() 可用于多种开发项目。
许多基于 的 2 程序可以非常方便地移植到嵌入式版本,适用于高端 (' 等产
品。 内部对于字符集的处理采用了 !), 编码标准。
是基于面向对象的 语言, 提供了 和 的对象通信机制,具有可查询
和可设计的属性以及强大的事件和事件过滤器,同时,还具有字符国际化,即支持根据上
下文进行国际化的字符串翻译。许多 的特性是基于 ,3 的继承,通过标准 技术
实现的。
2 Qt 对象模型
标准的 对象模型提供了非常有效的对运行时参数的支持,但 对象模型的静态
特性在某些问题上缺乏灵活性。图形用户界面编程需要运行的高效和高层次的灵活性。
提供了 的高速及 对象模型的灵活性。 增加了这些特性到 中:
4 非常有效的对象通信:信号与槽。
4 可查询和可设计的对象属性。
4 有效的事件及事件过滤器。
4 为国际化提供了上下文式的字符串翻译。
4 定时器使得在一个事件驱动的 *) 中整合多个任务成为可能。
4 层次化并可查询的对象树以对象继承关系这样自然的方式组织对象。
4 保护指针 *( 在引用对象销毁时自动设置到 5,不象正常的 指针在它们
的对象销毁时,指针变成危险的指针。
的这些特征基于 ,3 的继承性应用在标准 技术上。另外,象对象通信机制
和动态属性系统需要 自已的元对象编译器(.,3-)提供的元对象系
统。元对象系统是一个 扩展,这个扩展使得 更适合于真正的组件 *) 编程。组成
对象模型的基本类说明如表 :
表 对象模型的基本类说明
基类 基类说明
QGuardedPtr
它是个模板类,提供了对 QObject 对象指针的保护。
QMetaObject
关于 Qt 对象的元信息。
QMetaProperty
存储有关属性的元数据。
QObject
所有 Qt 对象的基类。
QObjectCleanupHandl
er
监视多个 QObject 的生命周期。
QVariant
扮作大多数通用 Qt 数据类型的联合。
表 中 *( 类和 ,3-6 的使用方法说明如下:
一个保护的指针 *(78,除了它在引用对象被销毁时能自动被设置到 5 外,
其它在使用时就象一个正常的 指针 9一样。而不象正常的 指针,在对象销毁时就
变成了不确定的指针。其中 必须是 ,3 的一个子类。保护的指针在你需要存一个别
人拥有的 ,3 指针时很有用,这个指针所指对象在你还在持有它的引用时,别人可能
删除它。你可以安全地测试这个指针的有效性。
保护的指针 *(78使用的方法如下面的例子:
QGuardedPtr<QLabel> label = new QLabel( 0, "label" );
label->setText( "I like guarded pointers" );
delete (QLabel*) label; // 模拟别人销毁了 label
if ( label)
label->show();
else
qDebug("The label has been destroyed");
程序将输出:;:,而不是引用了一个无效的地址。如果你需
要知道别人拥有的多个 ,3 何时已被删除,,3-6 将是很有用的,如:
分配在一个共享库里的应用程序卸载共享库时必须知道共享库的所有对象必须销毁。一个
使用 ,3-6 来监视对象销毁的例子如下:
class FactoryComponent : public FactoryInterface, public QlibraryInterface
{
public:
...
QObject *createObject();
6
bool init();
void cleanup();
bool canUnload() const;
6
private:
QObjectCleanupHandler objects;
};
6 // 分配一个新的对象并把它加入到 cleanup handler 中
QObject *FactoryComponent::createObject()
{
return objects.add( new QObject() );
}
6 // QLibraryInterface 接口应用
bool FactoryComponent::init()
{
return TRUE;
}
6 void FactoryComponent::cleanup()
{
}
6 //当所有 QObject 对象被销毁时,卸载库才是安全的。
bool FactoryComponent::canUnload() const
{
return objects.isEmpty();
}
元对象系统不能对信号与槽使用模板。一个简单的理由是:由于各个编译器的不充分,
不能在多个平台的应用程序中完全应用模板。即使今天,许多使用很广的 编译器应
用到先进模板时有问题。例如:你不能安全依赖于部分模板实例。
即使 编译器对模板有优秀的支持,我们也不能抛弃元对象编译器使用的基于字符
串访问。原因如下:
信号与槽的语法是直观的、易用易读,在类定义中声明了信号确保了信号在保护成
员函数中被保护。
的元编译器 0.,3-1产生能被任何标准 编译器访问的附加
代码。 读取 代码文件,如果它发现类声明中含有:<,=>:宏,它将给这些类
产生另外的 代码,其中装有元对象代码。这些被 产生有 源代码必须被编译连
接到这个类(或它能被? 进这个类的源文件里)。 通常不被手动调用,而是被
编译系统自动调用,这样它不需要编程员做另外的工作。
由于给信号与槽增加了 ,我们能加其它有用的东西到 ,这是模板类不能做的。
如:使用 01函数翻译,先进的属性系统和扩展的运行类型信息。属性系统可用于象
这样的通用用户界面设计工具。带有 预处理器的 基本上提供了面向对象
的 的灵活性或类似 >@ 的运行环境,并保持了 的执行效率和扩展性。
2.1 信号(signal)和槽(slot)
和 用于对象间的通讯。信号槽机制是 的一个重要特征。在图形用户界面
编程中,常需要将一个窗口部件的变化通知给另一个窗口部件,或者说希望对象间进行通
讯。一般的图形用户界面编程中采用回调函数进行对象间通信,这样回调和处理函数捆绑
在一起,没有 和 机制的简便和灵活。信号和槽连接的有原理图如图 。
图 信号和槽连接的原理图
的窗口部件有很多预定义的信号, 是一个可以被调用处理特定信号的函数。
的窗口部件又很多预定义的槽,当一个特定事件发生的时候,一个信号被发射,对信号感
兴趣的 就会调用对应响应函数。
信号槽机制在 ,3 类中实现,从 ,3 类或者它的一个子类(比如
类)继承的所有类可以包含信号和槽。当对象改变它们的状态的时候,信号被发送,对象
不关心有没有其它对象接收到它所发射的信号。槽是类的正常成员函数。可以将信号和槽
通过 函数任意相连。当一个信号被发射,它所连接的槽会被立即执行,就像一个普
通函数调用一样。信号与槽连接的示意图如图 +。
图 3 信号和槽连接示意图
一个带有信号和槽的 类 声明如下:
A-,3
B
<,=> 包含信号和或者槽的类必须声明 <,=>
-A
01C
@01B@CD
-A
@E01C 槽的声明
A
@@01C 信号声明
-@A
@C
DC
F
@AAE0@1
B
0@GH@1B
@H@C
@0@1C发送信号
D
D
下面把两个对象连接在一起:
IC
0JI/)*!'0@011IJI/,0E0111C信号与槽连接
KE01CHHHH
KE0L$1CHHL$HHL$
K@01C
调用 KE0L$1会使 发射一个 @01信号, 将会在它的 E01槽中
剩余63页未读,继续阅读
资源评论
- messilbj2015-07-27对刚开始学的我还是蛮有用的
- hellyhello2015-03-09初学QT,有点帮助
lyd107
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功