The Book of QT4 翻译:1.5 QT概览

25 篇文章 0 订阅
The Book of QT4 翻译:1.5 QT概览



The Book of QT4 翻译


QT程序设计艺术


---------------------------------------------------------------------------------


原名:The Book of QT 4:The Art of Building Qt Applications


译名:The Book of QT 4中文版:QT程序设计艺术


译者:张小可 mcxiaoke@gmail.com


---------------------------------------------------------------------------------


第一章 基础,工具和第一行代码


 


**********************************************************************
**************************     1.5    QT概览   *****************************
**********************************************************************


 


实际上,QT不仅仅是一个巨大的程序库,而是7个程序库,还包括许多使用工具,qmake是其中的一个。


 


1.5.1 QT程序库


 


今天,术语GUI工具包代表的东西的用途不再仅仅是系统提供的那么一个小部分(GUI界面)。尤其是QT,包含了用于应用程序开发的许多方面的扩展类。其中很多类与程序图形界面相关,但也有很多类涉及到网络编程,OpenGL支持,XML开发等方面。广泛的用途依赖于QT类的平台独立性:除了很少的例外,在所有的操作系统上,所有的类都可用,并且同样的类具有同样的方法和行为。


QT4包含下列程序库:


QtCore包含没有GUI界面的基础类。
QtGui包含GUI基础类。
QtNetwork包含网络类。
QtOpenGL包含OpenGL支持。
QtSql包含SQL数据库类。
QtXml包含XML和DOM类。(参见第45页)
QtAssistantClient允许你使用QT助手作为你的程序的文档浏览器。
Qt3Support包含为保证对QT3向下兼容的类。


 


Qt 4.1增加了QtSvg库,哟提供对SVG向量图形格式的支持,还增加了QtTest库,也被称作QTestLib,包括单元测试框架。


在Qt 4.2最终版中,奇趣公司增加了QtDBus模块,用于支持Freedesktop.org的公共信息系统(DBus)。


你可能需要将程序代码连接至多个库文件,用得最多的是QtCore和QtGui。因此,qmake默认包含这两个库。


需要连接的库文件由qmake的变量QT指定。默认包含变量core和gui。例如,要开发一个有网络支持的图形界面程序,你应该将值network添加到QT变量。即在工程文件.pro中添加这样的一行:


QT += network


要编写一个支持XML的控制台程序,只需要链接QtCore和QtXml,不需要QtGui,所以你必须添加值xml并且移除值gui。工程文件中添加如下两行:
QT -= gui
QT += xml


如果要使用Qt 4.0中的所有库文件,这样写:
QT += network opengl sql xml support(core和gui默认包含,不需要写)


除了在工程文件中指定之外,还有另外一个关于Qt库知识的特别有用的主题。除了定义类的独立头文件之外(这些头文件的文件名和它们描述的类的名字一致),QT也为它的程序库提供了头文件。这些文件中的每一个都包含了一个库的许多类文件的接口描述。因此,从本书开始到目前为止的所有例子中(我们都仅仅使用了QtGui中的类),我们没有写很多单个的#include声明,而只是简单的这样写:
#include <QtGui>


然而,这些库的头文件通常非常长,明显减慢了编译过程。如果编译器支持预编译头文件,这将不是一个问题,但是只有最近的编译器才支持(如GCC3.4以上的版本)。


 


基础库QtCore


QtCore是每个Q程序都必不可少的一个库。除了其它的,它提供了下面的功能:


基本数据类型,如QString和QByteArray
基本数据结构,如QList, QVector和QHash
输入输出类,如QIODevice, QTextStream和QFile
支持多线程编程的类(包括QWaitCondition和QThread)
基础类QObject和QCoreApplication(QApplication类的基类)


这些类都不依赖于GUI组件。独立于GUI使得Qt程序可以不使用GUI界面(如控制台程序)。
在非图形界面程序中,QCoreApplication承担了QApplication在图形界面程序中的职责:负责事件循环。如果你需要在网络连接中使用多线程的异步通信,就会发现这很有用。


 


图形界面库QtGui


QtGui库包含所有图形用户界面编程必须的类文件:
QWidget类和它的子类,如QLabel和QPushButton等
布局类(包括QVBoxLayout, QHBoxLayout和QGridLayout)
用于给程序添加菜单的类,如QMainWindow和QMenu
用于绘图的类,如QPainter, QPen和QBrush
提供现成的对话框的类(包括QFileDialog和QPrintDialog)
QApplication类
QtGui库依赖于QtCore库


 


网络库QtNetwork


QtNetwork库提供了部分编写网络应用程序需要的类。除了通过QTcpSocket和QUdpSocket类支持简单的套接字通信之外,网络库还通过QHttp和QFtp.支持CS(客户机-服务器)的HTTP和FTP连接。
和QtGui不同的是,QtNetwork依赖于QtCore库,但是它也可以与QtGui和其它库一起使用。


 


OpenGL支持库QtOpenGL


QtOpenGL库支持在Qt程序中使用OpenGL。它提供了QGLWidget类——一个Qt窗口部件,在其中你可以使用OpenGL指令绘图。QtOpenGL依赖于QtCore和QtGui库。


 


数据库类QtSql


QtSql库提供Qt程序中访问SQL数据库的能力。这个库包含用于建立SQL数据库连接以及查询和修改数据的类。Qt支持的SQL数据范围包括:开源数据库PostgreSQL, MySQL和SQLite。QtSql依赖于QtCore库,我们将在第九章深入讨论。


 


XML库QtXml


QtXML库提供了一个简易的,非验证的XML解析器。它通过SAX2(Simple API for XML)接口实现这个功能。
QtXml也包含DOM标准(Document Object Model 文档对象模型)的一个实现。相应的类允许你解析XML文档,操纵树结构,以XML文档格式发布修改过的文档,或者使用DOM创建一个新的XML文档。
这个库依赖于QtCore库,我们将在第十三章深入讨论。


 


Qt3兼容库Qt3Support


与前任Qt 3相比,Qt 4 的变化相当大:一些类包含的改进与Qt 3版本不兼容,还有一些类在Qt 4中被全新的不同名字的类取代。为了简化Qt 3程序移植到Qt 4的工作,奇趣公司在Qt3Support库中提供了相应的Qt 3的类。然而,在新程序中你不应该使用这个库,因为这些类已经停止开发了。因为这本书讲述Qt 4 编程,我们将不会使用这些类,而且以后也不会讨论它们。


 


向量图形库QtSvg


W3C发布的基于XML的SVG向量图形格式,具有巨大的潜力。从Qt 4.1版本开始QtSvg库支持SVG规范SVG Basic和SVG Tiny,它们用于显示SVG文件和动画,虽然QtSvg库还不能创建它们,也不能作为将SVG文件当作XML文档通过DOM树操纵它们。


 


帮助库QtAssistantClient


Qt助手库允许你精确控制Qt助手应用程序。允许你使用它作为你的程序的平台独立的帮助文件浏览器。这个模块的核心是QAssistantClient类。


Qt助手使用的自定义帮助页面必须是基本的HTML格式,而且必须有一个XML文件用于描述文档结构。


 


测试库QTestLib


本来QTestLib是在Qt核心发行版之外提供给付费用户的,从Qt 4.1.0版开始被纳入Qt常规发行版。测试库包含用于编写严格的单元测试的工具,涵盖的范围和Java中的JUnit类似。


 


消息库QtDBus
QtDBus是Linux和类Unix系统上的一个消息协议。例如,Linux硬件抽象层(HAL)和即将发布的KDE4都使用DBus作为进程间通信协议。尽管Windows和Mac OS X的移植版已经存在,但Qt 4.2将只针对Unix系统提供QtDBus库。然而,将来可能会发生变化。


 


ActiveQt 和迁移类


Windows平台特有的扩展ActiveQt使得可以通过Qt实现ActiveX组件和在Qt程序中使用ActiveX组件。然而,此功能仅仅在商业版的Qt中可用。


奇趣也提供了从基于MFC,Motif和Xt的程序迁移的解决方案。然而,和ActiveQt一样,它们也仅仅作为Qt 4单独的商业插件(Qt Solutions)提供,所以也不会在本书中讨论。



1.5.2 工具和实用程序


 


除了这些之外,Qt还包含了三个用于显示Qt文档,创建所见即所得(WYSIWYG)的对话框和将程序翻译成其它语言的GUI程序。Qt工具包也提供了一系列用于完成多种任务的命令行程序。


 


文档浏览器“Qt助手”


Qt文档包含的都是简单的HTML文件,可以通过浏览器或者Qt助手查看。与浏览器不同的是,Qt助手显示了整个文档的索引而且允许对文档进行全文搜索。


当日常使用Qt工作时,Qt助手的关键词目录特别有用。例如,如果你需要一个类的文档,如Qlabel,简单的在首页输入框中键入qlabel就可以了,回车后你将立即进入到完美的类文档。


Qt助手是本书的一个重要补充,因为它不仅仅解释了新增加的API调用(或者由于空间限制没有在本书中讨论的类),也提供了额外的用法示例。


 


界面编辑器“Qt设计师”


Qt设计师允许你以所见即所得的方式创建应用程序对话框和程序主窗口,这在创建复杂的对话框和布局时尤其有用。在设计师中你可以通过拖放添加窗口部件以及设置它们的属性。例如,你可以改变QLabel的文本以及颜色和字体。


你可以使用Qt设计师在一个布局中联合多个窗口部件,并且可以立即在窗口中看到布局效果。如果需要的话,你甚至可以使用它设置部件之间的信号-槽连接。


设计师的预览模式允许你检查你创建的用户界面:你可以看见布局大小改变的反应,测试窗口部件,观察信号-槽连接是否达到你想要的效果。


设计师还有一个模式用于指定窗口部件的TAB按键顺序:即当用户重复按下TAB键时独立部件的访问次序。这是用户界面的一个重要方面,所以你总是应该检查一下。如果TAB顺序合理的话,一个程序应该仅仅通过键盘就能直观的操作。注意如果你没有设置TAB顺序,Qt将自动设置,这可能导致结果不是你想要的。


为了在应用程序中使用设计师创建的对话框,你需要一个单独的转换工具。Qt设计师将界面设计方案以XML格式保存为扩展名为.ui的文件中。要想在程序中使用这种界面,必须使用命令行工具uic(User Interface Compiler)从XML描述生成C++代码。


 


如果你使用qmake创建工程文件,uic可以用于非常简单的集成设计师创建的界面:每个将要使用的.ui文件都被添加到.pro文件的FORMS变量。例如,.pro文件中的下面一行将mydialog.ui的对话框描述添加到了工程之中:
FORMS += mydialog.ui


然后qmake就会创建一个相应的规则:uic使用这个规则从mydialog.ui文件生成C++文件ui_mydialog.h。这个头文件包含了实现了对话框的界面描述的代码。(我们将在第三章详细讨论在应用程序中这个文件余下代码的使用。)


 


翻译工具“Qt 语言家”


Qt 语言家用于将应用程序从一种语言翻译成另一种语言。作为一个单独的图形界面工具,Qt 语言家允许你更容易在软件开发工作中集成语言翻译器。和Qt 设计师一样,Qt 翻译家也必须和外部的命令行工具一起使用,它们是lupdate和lrelease,用于更新软件工程的二进制文件,以及替换显示在用户界面的在不同语言中等价的单词和语句。lupdate从程序的源代码中抽出要被翻译的文本,并且根据工程文件中的定义生成翻译文件:


TRANSLATIONS = application_fr.ts \
    application_nl.ts


然后,我们使用GUI程序Qt 翻译家作为一个图形界面实用程序翻译(或者编辑)这种方式生成的语言文件。最后,lrelease创建一个包含应用程序翻译的附加的二进制文件,当程序请求时将在启动时加载,因此这时显示的界面就是已经翻译的。通过这种方式联合使用lupdate, 语言家和lrelease,应用程序代码不需要重新编写和编译就可以产生一个支持另外一种语言的发行版。


为了所有这些工作,应用程序的源代码必须进行一些转换。特别是代表需要翻译的文本的字符串都必须传递给函数QObject::tr()或者QApplication::translate()。这样做完成了两件事:


它允许Qt动态的改变字符串。如果你在源代码中仅仅指定了字符串"Hello,world!",那么当应用程序运行时它将被使用。但是如果你首先通过QObject类的函数tr()或者QApplication类的函数translate()发送字符串,那么这个函数将会查看翻译文件并返回一个包含它的字符串,替代原始的"Hello, world!"。


它允许lupdate能够寻找那些函数调用,从而定位源代码中需要翻译的段落。


不幸的是,1.1节的这个简单的“Hello, world!”程序不能被翻译成其它语言,因为我们没有对"Hello, world!"字符串使用tr()或translate()。为了修复这个缺点我们用将下面这行:


QLabel label("Hello, world!");


替换为:


QLabel label(QApplication::translate("MyLabel", "Hello, world!"));


QApplication::translate()函数使用第一个参数作为文本的上下文标志,然而QObject::tr()自动使用我们正在谈论的部件的类名作为文本的上下文标志。例如,如果你调用QLabel对象的tr()方法,Qt将自动使用上下文名字QLabel。这是可能的,因为QLabel继承自作为基类的QObject类,因此也继承了tr()方法。


上下文关系是非常重要的,因为同样的文本可能出现在不同的地方,有不同的含义。如果目标语言为这些变种使用清楚的术语,那么原始文本实例的准确翻译将依赖于上下文(语境)。例如,英语文本Open可能出现在一个对话框里含义是打开文件,但是在另外一个对话框可能含义是打开网络连接;这个程序的德语版应该将第一个翻译为Öffnen,而将第二个翻译为Aufbauen。当给两个实例不同的上下文标志时,Qt 语言家可以区分它们。


在你的程序中,你应该将所有的文本都发送到tr()或translate()函数。你将发现,在代码开发期间通常不需要很大的难度就可以完成程序翻译,(如果你没有这样做)一旦代码完成,仔细检查一个大程序的所有文本并手动添加tr()或translate()是十分乏味的。因此,本书余下部分的示例都将从一开始就使用tr()函数。


(你将在第十四章看到有关国际化和本地化的细节)


 


创建工程


正如1.1.1节说明的,qmake从平台独立的工程文件创建平台特定的Makefile文件。make或者nmake使用Makefile中存储的规则编译并链接程序。然而,nmake仅仅可以与Qt 商业版一起使用,不能用于Qt的开源版本。GPL许可下Windows版的Qt 4 应该使用GCC和移植自Linux的MinGW提供的GNU make替代nmake。


qmake工程文件不需要我们关注编译器或链接器选项。因此,我们将在本书的所有例子中使用qmake。


在Windows系统中,如果有一个Qt商业许可,你也可以使用qmake创建微软Visual Studio的工程文件。(Qt 插件在免费版的Visual Studio Express中不可用;这些用户需要依赖于命令行版本的qmake。)


对于Windows平台的开源开发者来说,Code::Blocks是一个不错的开发环境。它可以与Qt中附带的MinGW一起工作,甚至还包含了Qt 4的工程模板。然而,为了让它与qmake一起工作,你首先必须阻止它自己生成Makefile文件。为了做到这一点,选择工程--属性并且标记“这是一个自定义的Makefile文件”选项。然后查看工程--构建选项并激活命令选项卡,在预编译里面,输入下面的命令:


qmake -project
qmake
make.bat


为确保每当其它程序添加新文件时qmake都被调用,勾上选项“Always execute, even if target is up-to-date”。图1.13显示的是“Hello, world!”程序编译完后的Code::Blocks。


在工具菜单上保存启动Qt设计师,Qt 助手或者make的菜单项很有用。在某种范围内,你也可以使用这个功能启动你自己的程序,这些都可以在工具菜单的次级菜单Configure tools中指定。


在Mac OS X系统上,最好的开发环境是Xcode IDE。苹果从OS X 10.3版开始免费提供这一软件,但是它需要单独安装。Mac平台上的qmake作出了相应的改变,生成Xcode工程文件而不是Makefile文件。然而,如果你不想使用Xcode,仅仅想使用命令行工具,简单的添加-spec macx-g++就可以生成Makefile文件:
qmake -spec macx-g++
作为对照,
qmake -spec macx-xcode
在所有的Qt版本中,这将导致qmake生成Mac OS X平台的Xcode工程文件。qmake从.pro文件生成Xcode工程,该文件稍后将出现在Xcode的工程管理工具中。


qmake -spec macx-g++
为直接使用GCC生成Makefile文件。


当你在Linux下开发应用程序时,开发环境KDevelop可能是最好的选择。KDevelop 3.4提供了对Qt 4工程的支持。KDevelop包含一个工程模板和一个qmake工程文件的图形管理工具,这个工具可以无缝集成进IDE。


除了第一次启动之外,KDevelop将总是显示一个空白主窗口。选择工程--新建工程将启动工程向导,它将引导你一步一步创建一个KDevelop工程。要使用qmake创建一个支持Qt 4的工程,从图1.15所示的树形菜单中选择C++--Qmake Project--Basic Qt 4 application。完成第一步之后,向导还需要应用程序的名字和存储所有文件的目录。


下一步允许你选择一个源代码控制工具。如果你不使用源代码管理系统,保持默认选项NONE就可以了。剩下的几步允许你自定义将要插入到所有头文件和源文件中的代码模板。这些通常包含许可和作者的名字。图1.16显示了向导完成后例子程序主窗口的main.cpp文件。


按Shift+F9将构建和执行当前工程;在底部的Messages和Application选项卡中可以看到原样输出的构建信息,它们在构建和执行阶段分别自动打开。


qmake工程管理器(QMakeManager)隐藏在右边Qt标志的选项卡后面。向上扩展它,你就可以使用它图形化的添加,移除或打开文件。工程管理器分别呈现不同类型的源文件:KDevelop在新选项卡打开通常的源文件,当遇到.ui文件时自动启动Qt 设计师。


对那些不喜欢笨重的IDE的人来说,Kate编辑器(KDE Advanced Text Editor)是一个很好的替代品,它包含一个可以直接编译文件的下拉菜单,如图1.17所示。根据不同的发行版,你可能首先想要安装kate-plugins包(在所有的 包中),因为它提供了代码完成功能。通过这个插件,Kate提供了C和C++文件中方法和成员变量的概述,甚至允许代码片段管理,通过设置--配置Kate--应用程序--插件。


Kate的设置对话框提供了一个二级菜单,外部工具,在其中你可以添加自己的命令,就像在Code::Blocks中一样,它们稍后会出现在工具--外部工具中。设置--配置快捷键列出了键盘快捷键。


 


元对象编译器 moc(TheMeta-object Compiler)
Qt 中的信号-槽机制并不是纯C++,而是对C++标准的扩展。由于这个原因,Qt 提供了命令行工具moc用于将信号-槽结构黄钻换为标准的C++。moc为每个继承自QObejct的类生成额外的C++代码。这确保信号-槽连接可以在运行时动态生成。它也允许运行时动态检测使用QObject作为基类的类的名字,甚至可以检测一个类是否是另一个类的基类。


Qt 也包括了一个属性系统,moc为此生成必须的代码。属性是一个类的特殊特征,它可以设置和查询。例如,QLabel类有一个文本属性,它的值是一个包含标签显示的文本的字符串。对于每个属性都有两个函数:一个用于获取当前值,也被称之为GET方法(get method),另一个改变当前值,也被称之为SET方法(set method)。在QLabel的案例中,text()是GET方法,它返回标签的文本,setText()是SET方法,它给标签提供一个新文本。



这两个函数在类的定义中被标记为属性,允许通过QObject::property()查询文本,通过QObject::setProperty()设置文本。它们都需要一个被称作属性的字符串作为参数。Qt 设计师的属性编辑器在运行时确定属性的值,而且允许改变属性。如果你在一个单独的类中使用属性,那么它必须继承QObject类。


简单的说,任何时候只要一个类使用QObject作为基类就需要moc。任何一个那样的类的每个文件在运行C++编译器之前都必须使用元对象编译器进行预处理。在每个例子中,这将生成一个前缀为moc_的文件。


例如,如果你编写自己的对话框类MyDialog,并且使用QObject作为基类,类定义在MyDialog.h文件中,类真正的实现在MyDialog.cpp中,元对象编译器必须处理MyDialog.h,然后生成moc_MyDialog.cpp,并且将生成的文件集成到整个工程中,qmake自动完成这些工作。


 


Qt 资源编译器rcc


几乎每个程序都会使用图片或图像之类的外部资源。这些资源可以放在单独的文件中,也可以直接嵌入生成的可执行文件。Qt 4使用资源编译器rcc生成文件。资源编译器从以扩展名.qrc结尾的资源描述文件中获取信息。一个.qrc文件指定了程序使用的资源在文件系统中路径,从.qrc文件所在的目录开始。


如果你在qmake工程中包含资源文件,Qt 自动生成十六进制形式编码的数组,她存储量资源文件的内容。Qt 资源系统确保应用程序可以使用原来的目录和文件名访问已编码的资源。一个.qrc文件描述(使用XML)完成程序需要哪些文件。它看起来像下面这样:


<RCC>
<qresource>
<file>pics/symbols/stop.png</file>
<file>pics/symbols/start.png</file>
<file>pics/symbols/pause.png</file>
</qresource>
</RCC>


详细的路径一般都是理解为相对于资源文件所在的目录。在这个例子中,我们假定资源文件的名字为symbols.qrc,目录为pics/symbols,目录中包含需要的图片,该目录是源代码(包括资源文件)所在目录的下面。


为了使qmake可以考虑到来自资源文件的信息,在工程文件中必须添加相应的RESOURCES指令:
RESOURCES = symbols.qrc


pics/symbols目录下的图像文件stop.png在程序代码中可以像下面这趟引用:


myLabel->setPixmap(QPixmap(":/pics/symbols/stop.png"));


就是说,为了指向一个资源,你仅仅需要在.qrc文件中指定的路径前面放一个冒号。(紧跟着的斜线符号并不是一个错误;在逻辑路径标记中,文件系统中的相对路径中被指定为绝对路径,源代码所在的目录作为根目录。)如果资源描述文件正确的集成进来工程文件,QPixmap()方法可以正确的解析路径,这个标签将显示一个停止图标。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值