Qt简明教程1、Qt的安装首先去Qt的官方网站()下载你所需要的安装包,官方提供了Windows、Linux、MacOS等平台的安装包,这里我们选择Linux平台下的安装包。截至到目前为止,Qt的最新版本为4.7,所以我们下载所对应的安装包为qt-sdk-linux-x86-opensource-2010.05.1.bin。下载完毕后我们打开超级终端,切换到root用户(sudosu),然后提升安装包的权限,使其具有执行权限,接着执行./qt-sdk-linux-x86-opensource-2010.05.1.bin,弹出如下界面:接着按照提示,一路next就可以了,安装完成后,接下来我们开始进入Qt的学习过程。2、Qt的发展史Qt的创建者HaarardNord(Trolltech公司的CEO)和EirikChambe-Eng(Trolltech公司的总裁)是一家瑞典公司的同事。那时(1990)他们在做一个项目,这个项目需要在Unix,Macintosh,Windows上运行同一个GUI,象我们现在的开发人员一样,工作的很累,当时可是没有如今这么多的开发工具。一天他们工作之余去公园散步,晒太阳,喝咖啡。Haarard说:“Weneedanobject-orienteddisplaysystem。”这成为了后来Qt最重要的思想:提供面向对象的跨平台的GUI框架。看到这里小女我不仅感慨:什么时候我们的程序员们可以在工作的时候出来走走,只有在轻松愉快的环境中才会生产出出色的成果。在沉闷的办公室里,只是机械的堆砌代码而已。所做就做,Haarard开始写代码,Eirik负责设计,Qt在襁褓中逐渐成长,在开始蹒跚学步的时候(1993年),他们开始让Qt闯荡江湖,两个人开始了创业的艰辛历程。对这两个年轻人,1994年是非常艰难的一年,他们没有客户,没有钱,只有还没有完全实现的产品。关键时刻,他们的妻子帮他们渡过了难关。字母Q作为所有类的前缀,是因为Haarard手写这个字母看起来特别的漂亮,字母t代表“toolkit”,在Xt,Xtoolkit等中得到灵感。1995年开始出现转机,他们得到了一个合同。这一年,他们雇佣了ArntGulbrandsen,他在Trolltech工作了六年,他为Qt实现了优秀的文档系统。1995年5月,Qt0.9发布,有商业和开源两个版本。96年9月,Qt1.0发布。1997年,MatthiasEttrich开始用Qt开发KDE,使Qt成为Linux上GUI开发的事实上的标准。1999年,Qt2发布。2000年,Qtopia发布。支持linux嵌入式开发。2001年,Qt3发布。2005年,Qt4发布。十年来,Qt就是这样从不知名的一个产品,发展到现在拥有全世界范围内成千上万的客户。3、Qt入门3.1从HelloQt开始差不多所有的程序教材都从Hello开始,下面就是这个程序的qt版本。首先向/etc/profile文件里添加如下内容#setqtenvQT_HOME=/opt/qtsdk-2010.05/PATH=$QT_HOME/qt/bin:$PATH我的qt安装路径是/opt/qtsdk-2010.05/,请大家添加你自己的路径,这样下次重新启动电脑后,就可以使用qmake命令了。使用VIM编辑器建立一个HelloQt.cpp文件,文件内容如下:1#includeQApplication2#includeQLabel3intmain(intargc,char*argv[])4{5QApplicationapp(argc,argv);6QLabel*label=newQLabel(HelloQt!);7label-show();8returnapp.exec();9}按行解析以上9行代码第一,二行:是代码中需要使用的类的头文件。在Qt4中,可以写成QApplication的格式,当然也可写成“QApplication.h”。第三行:是main函数的标准写法第五行:创建一个QApplication对象,管理应用程序的资源。第六行:QLabel对象,QLabel是一个Qt提供的小控件,显示一行文本。第七行:显示QLabel。第八行:QApplication.exec(),让程序进入消息循环。等待可能的菜单,工具条,鼠标等的输入,进行响应。打开终端,进入HelloQt.cpp所在目录,执行:qmake–projectqmakemake执行完所有的命令后,再执行./HelloQt,出现如下界面第6行代码还可以如下替换:QLabel*label=newQLabel(h2iHello/ifontcolor=redQt!/font/h2);这里面包含了html文本,显示的字体,颜色会改变,运行结果如下:实际程序中,下面两行是比不可少的。QApplicationapp(argc,argv);returnapp.exec();3.2建立连接这个例子用来说明怎么响应信号,和hello程序的源代码相似,原来的Label用一个按钮代替,点击时退出程序。源程序如下:1#includeQApplication2#includeQPushButton3intmain(intargc,char*argv[])4{5QApplicationapp(argc,argv);6QPushButton*button=newQPushButton(Quit);7QObject::connect(button,SIGNAL(clicked()),8&app,SLOT(quit()));9button-show();10returnapp.exec();11}当有所动作或者状态改变,qt的控件会发出消息(signal),例如,当点击按钮时,按钮会发送clicked()消息,这个消息可以连接到一个函数上(这个函数在这里成为slot)。这样,当一个消息发送时,slot函数可以自动执行。在这个例子中,我们连接了按钮的clicked信号和QApplication的quit函数,语法如第七,八行所示。然后运行程序,点击Quit按钮,程序将会中止。4创建对话框(CreatingDialogs)在这章介绍如何创建Qt的对话框。对话框是程序和用户交互的桥梁,提供了程序和用户之间对话的一种方式。很多程序都是由一个主窗口,在这个主窗口中包含一个菜单条,多个工具条,和足够多的对话框。也有些程序本身就是一个对话框,直接相应用户的输入请求。本章中我们首先会用代码的方式创建我们的第一个对话框,然后用QtDesigner工具创建对话框。QtDesigner是一个可视化的工具,用它可以更快的创建,修改对话框。4.1派生对话框类(SubclassingQDialog)第一个例子是一个用C++实现的查找对话框。我们把这个对话框实现为一个类,这样它就是一个独立的控件,并有自己的信号(signal)和slot函数类的源代码分别放在finddialog.h和finddialog.cpp中。首先看finddialog.h的代码1#ifndefFINDDIALOG_H2#defineFINDDIALOG_H3#includeQDialog4classQCheckBox;5classQLabel;6classQLineEdit;7classQPushButton;8classFindDialog:publicQDialog9{10Q_OBJECT11public:12FindDialog(QWidget*parent=0);13signals:14voidfindNext(constQString&str,Qt::CaseSensitivitycs);15voidfindPrevious(constQString&str,Qt::CaseSensitivitycs);16privateslots:17voidfindClicked();18voidenableFindButton(constQString&text);19private:20QLabel*label;21QLineEdit*lineEdit;22QCheckBox*caseCheckBox;23QCheckBox*backwardCheckBox;24QPushButton*findButton;25QPushButton*closeButton;26};27#endif一共27行,第1,2,27行是为了避免头文件被多次包含。第3行包含QDialog头文件,这个类从QDialog继承,QDialog从QWidget继承。第4至7行是用到的Qt中类的前向声明。通过前向声明,编译器就知道这个类已经存在,而不用写出包含的头文件。这个问题稍后还要讲。第8至26行是类FindDialog的定义。第10行,Q_OBJECT是一个宏定义,如果类里面用到了signal或者slots,就要声明这个宏。第12行,FindDialog(QWidget*parent=0);构造函数是Qt控件类的标准格式,默认的父参数为NULL,说明没有父控件。第13行,signal声明了这个对话框发出的两个信号,如果选择向前查找,那么对话框就发出findPrevious()信号,否则,发出findNext()信号。signal也是一个宏,在编译之前,C++预处理把它变成标准的c++代码。Qt::CaseSensitivity是一个枚举类型,有Qt::CaseSensitive和Qt::CaseInsensitive两个值。在类的私有部分,声明有两个slot函数。为了实现这两个函数,需要用到对话框的其他控件的信息,所以保存了一些控件的指针。slot关键字和signal一样,也是一个宏。对于私有成员变量,我们只是使用了它们的指针,没有对它们进行存取操作,编译器不需要知道它们的详细定义,所以只使用了这些类的前向声明。当然,也可以使用QCheckBox,QLabel等,但是,使用前向声明会让编译速度更快一些。下面看一下finddialog.cpp源文件代码:文件头和构造函数部分1#includeQtGui2#includefinddialog.h3FindDialog::FindDialog(QWidget*parent)4:QDialog(parent)5{6label=newQLabel(tr(Find&what:));7lineEdit=newQLineEdit;8label-setBuddy(lineEdit);9caseCheckBox=newQCheckBox(tr(Match&case));10backwardCheckBox=newQCheckBox(tr(Search&backward));11findButton=newQPushButton(tr(&Find));12findButton-setDefault(true);13findButton-setEnabled(false);14closeButton=newQPushButton(tr(Close));15connect(lineEdit,SIGNAL(textChanged(constQString&)),16this,SLOT(enableFindButton(constQString&)));17connect(findButton,SIGNAL(clicked()),18this,SLOT(findClicked()));19connect(closeButton,SIGNAL(clicked()),20this,SLOT(close()));21QHBoxLayout*topLeftLayout=newQHBoxLayout;22topLeftLayout-addWidget(label);23topLeftLayout-addWidget(li