1、目录 1目 录第一章 Qt 简介 .51.1 选择 Qt 库 .51.2 安装 Qt 库 .61.3 带你进入 Qt 的世界 .7第二章 创建对话框 .132.1 对话框 .132.2 深入信号和槽 .182.3 快速设计对话框 .202.4 可变形状的对话框 .262.5 动态对话框设计 .332.6 内置控件和对话框类 .33第三章 创建主窗口 .413.1 子类化 QMainWindow.423.2 创建菜单和工具条 .453.3 创建状态栏 .493.4 实现文件菜单 .513.5 使用对话框 .573.6 保存设置 .623.7 多文档 .633.8 启动画面 .66第四章 应用程序
2、编写 .694.1 中央部件 .694.2 从 QTableWidget 类继承 .694.3 载入和保存 .754.4 实现 Edit 菜单 .774.5 其它菜单项 .814.6 从 QTableWidgetItem 类继承 .85第五章 创建自定义部件 .935.1 自定义部件 .935.2 从 QWidget 类继承 .955.3 将自定义部件集成到 Qt Designer 中 .103第六章 布局管理器 .1076.1 排列部件 .1076.2 分组布局 .112目录26.3 分割控件 .1146.4 滚动区域 .1176.5 可停靠控件和工具栏 .1196.6 多文档界面 .121
3、第七章 事件处理 .1317.1 重写事件处理函数 .1317.2 事件过滤器 .1357.3 忙时响应 .138第八章 2D 图形 .1418.1 绘图类 QPainter.1418.2 坐标变换 .145第九章 拖拽功能 .1559.1 支持多拽 .1559.2 自定义拖拽类型 .1599.3 剪切板 .164第十章 数据视图类 .16510.1 使用数据视图类 .16610.2 预定义模型类 .172第十一章 容器类 .17911.1 顺序容器 .17911.2 关联容器 .18611.3 通用算法 .18811.4 字符串, 字符数组, 变量 .190第十二章 输入/输出 .19712
4、.1 读写二进制数据 .19812.2 读写文本文件 .20212.3 遍历目录 .20712.4 嵌入资源 .208第十三章 进程与进程间通信 .21113.1 使用 QProcess.21113.2 进程间通讯 .213第十四章 多线程 .21914.1 创建线程 .21914.2 同步线程 .22214.3 与主线程通信 .22914.4 在次线程中使用 Qt 的类 .234第十五章 网络 .237目录 315.1 写 FTP 客户端 .23715.2 写 HTTP 客户端 .24515.3 写 TCP 客户/服务器应用程序 .24815.4 发送和接收 UDP 数据报 .257第十六章
5、 提供在线帮助 .26316.1 工具提示、状态提示和“What This?”帮助 .26316.2 利用 Web 浏览器提供在线帮助 .26516.3 将 QTextBrowser 作为简单的帮助引擎 .26716.4 使用 Qt Assistant 提供强大的在线帮助 .270第一章 Qt 简介5第一章 Qt 简介 选择 Qt 库 可移植性 带你进入 Qt 的世界1.1 选择 Qt 库GUI 工具包(或 GUI 库)是构造图形用户界面(程序)所使用的一套按钮、滚动条、菜单和其它对象的集合。在 UNIX 系统里,有很多可供使用的 GUI 库,其中之一就是 Qt 库一个基于 C+编程语言的工具
6、包。由于 Qt 是基于 C+,因此它具有速度快,易于使用,可移植性好的特性。所以,当需要开发UNIX 或 MS Windows 环境下的 GUI 程序时,Qt 是最佳选择。1.1.1 可移植性Qt 不只是适用于 UNIX,它同样适用于 MS WINDOWS。如果你是一个以编程为生的程序员,那么你的目标一定是吸引尽可能多的用户,以使他们有机会购买你的产品。如果你的主要平台是 MS WINDOWS,你很可能使用标准库MFC,但是你这样做,可能使你失去世界上几百万的 UNIX 用户。相反,如果你的主要平台是 UNIX,你可以使用其它工具包,如 Gtk+或 Xforms,但这样会使你失去更多的 WIN
7、DOWS 用户。那么,最好的方法就是选择一个既适用于 WINDOWS 又适用于 UNIX 的 GUI 工具包,Qt 就是一个最好的选择。1.1.2 易用性如前所述,Qt 是一个 C+工具包,它由几百个 C+类构成,你在程序中可以使用这些类,因为 C+是面向对象的编程的语言,而 Qt 是基于 C+构造。所以, Qt 也具有 OOP 的所有优点。(OOP - Object Oriented Programming 面向对象编程)1.1.3 运行速度Qt 非常容易使用,且也具有很快的速度。这两方面通常不能同时达到。当我们谈论其他 GUI 开发包时,易用常意味着低速,而难用则常意味着快速(或者从另一个
8、方面讲,低速意味着易用,而快速则意味着难以使用) ,但当谈论 Qt 时,其易用性和快速是密不可分的,这一优点要归功于 Qt 开发者的辛苦工作,他们花费了大量时间来优化他们的产品。Qt 比其他许多 GUI 工具包运行速度快的另一原因是它的实现方式,Qt 是一个 GUI 仿真工具包,这意味着它不使用任何本地工具包作调用。Qt 使用各自平台上的低级绘图函数仿真 MS Windows 和Motif(商用 UNIX 的标准 GUI 库) ,当然,这能够提高程序速度。其他适用于多种平台上的工具包,如第一章 Qt 简介6wxWindows,则是适用 API 层或 API 仿真,这些方法均以不同的方式使用本地
9、工具包,从而降低程序的运行速度。1.2 安装 Qt 库Qt 安装过程非常简单。本节介绍怎样在 UNIX/Linux 系统上安装 Qt。1.2.1 编译和安装从 站点下载最新的 qt-x11-4.4.3 的开发包,然后自己编译它。这样能够确保 Qt 库被正确安装,并且保证所安装的软件版本包含来自 Troll Tech 公司的最新功能和改进。现在可以开始下载。当下载窗口从屏幕消失后,下载完成,便可以开始安转了。将最新下载的文件复制到/usr/local 目录中,当然你也可以自己新建一个目录,我就把 qt-x11-opensource-src-4.4.3.tar.gz 复制到/QT 目录下面。那下
10、面进到 QT 目录下,并执行下面的命令。#tar zxvf qt-x11-opensource-src-4.4.3.tar.gz该命令将文件解压到一个子目录中,然后将目录名字更改为 qt-x11-4.4.3#mv qt-x11-opensource-src-4.4.3 qt-x11-4.4.3然后进入 qt-x11-4.4.3 目录中#cd qt-x11-4.4.3#./configure如果你想查看./configure 的相关配置命令,可以输入#./configure help (查看配置)接下来就可以通过 makefile 来编译 Qt 库了当你看到Qt is now configure
11、d for building. Just run gmake.Once everything is built, you must run gmake install.Qt will be installed into /usr/local/Trolltech/Qt-4.4.3To reconfigure, run gmake confclean and configure你的 confiure 也就完成了,在执行 configure 的过程中,可能会出现错误,导致错误的原因或许是g+编译版本的问题,我使用的 g+编译器版本是 Linux 自带的 4.1.1 版本的 g+,可以顺利通过。下一步
12、就是执行#make 了(这是一个很漫长的过程) 。经过漫长的等待,终于编译完了,紧接着执行#make install然后设置环境变量打开/etc/profile 或者.bashrc 文件,在文件末尾加上:第一章 Qt 简介7export QTDIR=/usr/local/Trolltech/Qt-4.4.3export PATH=$QTDIR/bin:$PATHexport LD_LIBRARY_PATH=$QTDIR/lib:$QPEDIR/lib:$LD_LIBRARY_PATHexport QMAKESPEC=$QTDIR/mkspecs/linux-g+现在我们的准备工作就已经做完了,
13、下面就让我们进入 QT 的世界吧!1.3 带你进入 Qt 的世界1.3.1 Hello Qt我们通过一个简单的例子带你进入 Qt 的世界。让我们先一行行的解读下面的代码,然后再编译,运行。1 #include 2 #include 3 int main(int argc, char* argv)4 5 QApplication app(argc, argv);6 QLabel *label = new QLabel(“Hello Qt!“);7 Label-show();8 return app.exec();9 第 1,2 行包含的头文件中声明了 QApplication 和 QLabel
14、类。对于每一个 Qt 类来说,它们的头文件名称总是与它们的类名相同。第 5 行创建了一个 QApplication 类的对象,来管理应用程序(或许这个地方用进程更合适)资源。QApplication 的构造函数,需要传入 argc,argv 参数,因为 Qt 支持命令行参数。第六行创建了一个 QLabel 的部件,用来显示“Hello Qt!”。用 Qt 和 Unix 的术语来说,部件就是用户接口中的一个可视化元素。按钮,菜单,滚动条等都是部件的实例。当然,一个部件中可以包含另一部件,比如,一个应用程序窗口(也是一个部件)通常就包含了菜单,工具栏,状态栏,和一些其他的部件。大多数应用程序都以
15、QMainWindow 和 QDialog 作为它们的主窗口。当然其他的部件也可以作为主窗口,这也是 Qt 的灵活之处。在上面的例子中,QLabel 就是应用程序的主窗口。第 7 行代码使 label 变的可见。部件在创建时,往往都是隐藏的,这样我们可以在让它可见之前设置参数,以免让窗口发生抖动。第 8 行通过 exec( )函数将应用程序的控制权交给 Qt。代码执行到这里时,程序进入事件循环。我们这里所说的事件,通常是指点击鼠标,和敲击键盘。程序会处理由于用户活动产生的事件。例如,当用户点击一个部件时,会产生鼠标按下和释放两个事件。在上面的代码中,我们并没有去释放 label 指针所指向的内
16、存空间,这或许会令许多 C+程序员感到不解,当然,您也不必费解,内存释放的事情已经由 Qt 在 main 函数结束时帮您完成了,这也是 Qt 值得称赞的地方,防止了由于部件而产生的内存泄露问题。OK,现在我们可以来试着编译,运行一下这个程序了。首先,要先安转好 Qt 4.4.3 的库(我想你已第一章 Qt 简介8经完成了吧) ,并设置好环境变量,然后把 hello.cpp 的文件复制到 hello 的目录中。让我们进入 hello 的目录,并键入如下命令:qmake project生成一个与平台相关的工程文件,然后再键入:qmake hello.pro (或者直接 qmake)生成一个指定平台
17、下的 makefile然后就可以用 make 来编译程序,编译通过后,生成可执行文件 hello,通过./hello 来运行程序即可。1.3.2 连接信号和槽这个例子向我们展示了如何处理用户的操作。这个应用程序有一个按钮,点击按钮后可退出程序,下面是程序代码:#include #include int main(int argc, char *argv)QApplication app(argc, argv);QPushButton *button = new QPushButton(“Quit“);QObject:connect(button, SIGNAL(clicked(),button
18、-show();return app.exec();(注:signal and slots parameters must not contain any variable names, only the type.)当用户有点击动作,或者部件的状态发生变化时,便会触发一个信号。例如,当用户点击按钮时,会产生一个 clicked()信号,当信号发射出去以后,与信号相连接的 slot(槽)就会自动执行。在上面的例子中,我们把按钮的 clicked()信号和 QApplication 对象的 quit()槽连接起来,因此点击按钮后,程序就会退出。在例子中所使用的宏 SIGNAL( )和 SLOT(
19、 )是 QT 特有的语法,在下面的章节中将会详细介绍到。图 1-1 The Quit application让我们来编译 Qt 的应用程序的。假设你已经创建了一个名为 quit 文件夹,并且包含了 quit.cpp。进第一章 Qt 简介9入到 quit 文件夹中,执行 qmake -project 来创建一个工程文件,然后再执行一次 qmake,创建 makefile,过程如下所示:qmake projectqmake (或者 qmake quit.pro)现在你可以执行这个程序的可执行文件了,点击按钮,或者点击空格键,程序就会退出。1.3.3 Laying Out 部件在这个一节中,我们通过
20、一个小例子来展示如何使用 layouts(布局器)来管理窗口中部件的几何位置以及如何使用信号和槽来让不同的部件之间同步。这个程序用来询问用户的年龄,用户可以通过 spinbox或者 slider 来输入自己的年龄。这个程序由这几个部件组成:QSpinBox,QSlider,QWidget。QWidget 是程序的主窗口,QSpinBox,QSlider 作为 QWidget 的子部件。QWidger 的构造函数以及它子类的构造函数都有一个QWidget *的参数来指明它的父部件。图 1-2 The Age application源码如下:1 #include 2 #include 3 #inc
21、lude 4 #include 5 int main(int argc, char *argv)67 QApplication app(argc, argv);8 QWidget *window = new QWidget;9 Window-setWindowTitle(“Enter Your Age”);10 QSpinBox *spinBox = new QSpinBox;11 QSlider *slider = new QSlider(Qt:Horizontal);12 spinBox-setRange(0, 130);13 slider-setRange(0, 130);14 QObject:connect(spinBox, SIGNAL(valueChanged(int), slider, 15SLOT(setValue(int);16 QObject:connect(slider, SIGNAL(valueChanged(int)