QT界面开发

QT界面开发
QT界面开发

1Qt4界面开发

1.1Q t历史

Qt是一个用于桌面系统和嵌入式开发的跨平台应用程序框架。它包括一个直观的API 和一个丰富的类库,以及用于GUI开发和国际化的集成工具,另外它支持Java?和C++开发。Qt让企业无须重新编写源代码,便可以构建运行在不同桌面操作系统和嵌入式设备上的软件应用程序。

Qt框架最早可公开获取是在1995年5月。最初是由Haavard Nord(TrollTech公司的首席执行官)和Eirik Chambe-Eng(TrollTech公司的董事会主席)。Haavard和Eirik 最早在特隆赫姆的挪威技术学院相遇,在那里他们双双获得了计算机科学硕士学位。

早在1991年,Haavard 就开始写一些最终成为Qt的类,并和 Eirik合力设计。在接下来的一年,Eirik提出了“信号和槽”的思想,一个现在已经被一些其他套装工具包含简单但功能强大的GUI编程范式。Haavard 接受了这一思想并手工生成了这一思想的代码实现。到1993年,Haavard和Eirik已经完成了Qt的第一个图形内核的开发并能用它来实现一些他们所需的物件。在这一年的年末,Haavard建议他们一起去经商,创建一个“世上最好的C++ GUI框架”。

字母“Q”被选为类的前缀是因为这个字母在Haavard的Emacs字体中看起来很漂亮。受到Xt(the X toolkit)的启发,字母“t”被追加来表示“toolkit”。公司在1994年5月4日成立,起初被命名为“Quasar Technologies”,之后被改名为“Troll Tech”,今天则被称为奇趣科技(Trolltech)。

1995年5月20日,Qt 0.90被上传到https://www.360docs.net/doc/4015445569.html,。六天后,这一发布在comp.os.linux.announce被宣布。这是Qt的第一个公共发行版。Qt可以被用在Windows 和Unix开发中,在两个系统中提供相同的API。Qt从一开始就可以在两种许可协议下获取:一个是商业开发中需要的商业许可协议,一个用于开源开发的自由软件版。

1996年3月,欧洲航天局成为Qt的第一个客户,一下买了十个Qt商业许可。Qt 0.97在同年的5月底发布,1996年9月24日,Qt 1.0发布。到了同年年底,Qt到达了版本1.1;拥有8个客户,每一个都在不同的国家,他们购买了18个商业许可。

Qt 1.2 在1997年4月发布。Matthias Ettrich利用Qt构建KDE的决定帮助Qt成为Linux C++ GUI 开发的实际标准,1997年9月Qt 1.3发布。

1998年9月,Qt 1的最后一个主要发行版1.40发布。Qt 2.0于1999年7月发布。Qt 2有了一个新的开源许可协议,发布许可协议(QPL),遵守开源的定义。1999年8月,Qt赢得了LinuxWorld的“最佳开发库/工具”大奖。

2000年奇趣科技发布了Qtopia核心(后来成为Qt/Embedded)。它被设计用来运行在嵌入式Linux设备上并提供了自己的窗口系统作为X11的一个轻量级代替。现在Qt/X11和Qtopia核心都可以通过GNU通用许可(GPL)获取。到2000年年底,奇趣科技成立了Trolltech Inc.(USA)并且发布了Qtopia的第一个版本,一个移动电话和PDAs应用程序平台。Qtopia赢得了2001和2002年LinuxWorld的“最佳嵌入式 Linux 解决方案”大奖,

Qtopia Phone 也在2004年赢得了相同的荣誉。

2001年Qt 3.0发布。Qt现在可以在Windows,Mac OS X,Unix和Linux(桌面和嵌入式系统)上获取。Qt 3新增了42个类,代码超过了500,000行。Qt3是Qt2的一个大的进步,包括相当大的本地化和Unicode支持,一个全新的文本查看和编辑物件,和一个类似Perl的正则表达式类。2002年Qt 3赢得了软件开发时代的“Jolt 产品大奖”。

2005年夏天,Qt 4.0发布。包括大约500个类和9000多个函数,Qt 4比以前的任何版本都要大,都要优雅,并且它已经被分割成几个库,因此程序员只需要包含他们需要的Qt 的一部分。Qt 4包含了一套全新的高效且易用的模版容器,高级的模型/视图函数,一个快速且有弹性的2D绘图框架,和功能强大的Unicode文本查看/编辑类,还有一些未提到的针对所有类的许多得较小的增强,这较以前的版本有了巨大的进步。Qt 4是第一个在所有支持平台上都可以通过商业和开源开发许可获得的Qt版本。

从奇趣诞生的第一天,Qt的流行就从未减弱过,即使今天也仍在继续。这一成功不但反映了Qt良好的品质,也反映了Qt的使用乐趣。在最近的十年中Qt从默默无闻成长为一个全世界成千上万客户和开源开发者每天都要使用的产品。

1.2Q t产品概述

Qt 是一个全面的开发框架。它包含一个广泛的队列,该队列为功能、性能和工具队列,用以确保针对多客户端和服务器端的高性能、跨平台开发。针对范围广泛的各行各业,包括Google?、Adobe Lucasfilm 和 Skype?,通过在Qt一个平台上的软件投资而涵盖其它众多平台,Qt可以缩短投入市场的时间并且提高生产效率。

图1.1 Qt框架结构图

z Qt类库模块是一个拥有超过400个类,同时不断扩展的类库。它封装了用于端到端应用程序开发所需要的所有基础结构。

z Qt设计者(Designer)是一个功能强大的GUI布局与窗体构造器,能够在所有支持的平台上,以本地化的视图外观与认知,快速开发高性能的用户界面。

z Qt语言家(Linguist)是一套用来消除国际化工作流程中所带来障碍的工具。

z Qt助手(Assisstant)一个完全可自定义,重新分配的帮助文件或文档浏览器,它可与基于Qt 的应用程序运行。

z Java程序员可获得的Qt Jambi作为一个支持Java?的跨平台多用户端应用开发框架,Qt现已提供给Java程序员。

Qt拥有一系列窗体(在 Windows 术语中称为“控件”),这些窗体可提供标准的GUI 功能。Qt引入了一种名为“信号和槽”的新型替代技术,供对象之间通信使用,它取代了在过时的框架中使用的老旧的、缺乏安全性的传统回调技术。另外,Qt还提供了一种传统事件模型,用来处理鼠标单击、按键以及其他用户输入操作。Qt的跨平台GUI应用程序可以支持现代应用程序所需的所有用户界面功能,例如:菜单、上下文菜单、拖放以及可停靠工具栏。使用Qt提供的桌面集成功能,通过利用每个平台提供的服务,可以将应用程序扩展至所在的桌面环境中。

Qt还提供了一款专门用于用户界面图形设计的工具--Qt Designer。Qt Designer 除了提供绝对定位功能以外,还支持强大的布局功能。使用Qt Designer,既可专门设计GUI,又可以利用它提供的与流行的集成开发环境集成的功能,用其开发整个应用程序。

Qt对2D和3D图形有着卓越的支持。Qt实际上是针对平台独立的OpenGL编程而开发的标准GUI框架。Qt 4的绘图系统为所有支持的平台提供了高质量的渲染功能。使用Qt 4的高级画布框架,开发人员可以创建各种交互式图形应用程序,从而充分利用Qt的先进绘图功能。

Qt可以使用标准数据库创建与平台无关的数据库应用程序。针对Oracle、Microsoft SQL Server、Sybase Adaptive Server、IBM DB2、PostgreSQL.、MySQL、Borland Interbase、SQLite 和 ODBC 兼容的数据库,Qt提供了本地驱动。另外,Qt还提供了专用于数据库的控件,使任何内建或自定义控件均可感知数据。

使用Qt的样式支持和主题支持功能,Qt编程可获得所有支持的平台的本地化观感。从单一源码树只需采用重新编译方式即可为Windows 98至Windows XP和Windows VistaTM、Mac OS X、Linux、Solaris、HP-UX 以及其他使用X11的Unix版本生成应用程序。另外,Qt应用程序经过编译也能在Qtopia中运行。使用Qt的qmake构建工具,可为目标平台生成相应的makefile或.dsp文件。

由于Qt的架构充分利用了底层平台的优点,许多用户在Windows,Mac OS X和Unix 平台上做单一平台开发时也使用Qt,因为他们更愿意使用Qt的方法。Qt包含了对具体平台的特有功能的支持,例如:Windows中的ActiveX以及Unix中的Motif。

Qt全面使用 UnicodeTM,并且对国际化支持十分成熟。Qt还为翻译人员提供了Qt Linguist(语言家)以及其他工具。应用程序可以轻松地混合使用阿拉伯语、汉语、英语、以色列语、日语、俄罗斯语以及Unicode支持的其他语言。

Qt提供了一系列与特定域相关的类。例如,Qt的XML模块提供了SAX和DOM类,可以读取并操作以XML格式存储的数据;使用Qt的STL兼容集合类,可以将对象存储在内存中;使用与Java和C++标准模板库(STL)中相同样式的迭代器来操作对象;使用Qt 的输入/输出和网络连接类,可以使用标准协议处理本地文件和远程文件。

插件和动态库可以进一步扩展Qt应用程序的功能。插件提供了附加编解码器、数据库驱动、图像格式、样式和控件。

QtScript模块通过提供Qt Script以支持应用程序的脚本化,Qt Script是基于ECMA 脚本的类似于JavaScript的语言。此技术允许开发者向用户提供对应用程序的一部分的有限访问,以用于脚本化用途。

Qt是一种成熟的C++框架,在全球各地广泛使用。Qt除了具有众多商业用途以外,其开源版本还为KDE(即:Linux 桌面环境)奠定了基础。Qt跨平台的构建系统、可视化窗体设计以及一流的API,使应用程序开发成为一种乐趣。

1.3W indows XP下安装Qt

1)下载安装文件

首先去官方网站下载Qt OpenSource(qt-win-opensource-4.4.0-mingw.exe),现在的最新版本是4.4,下载连接:

https://www.360docs.net/doc/4015445569.html,/developer/downloads/qt/windows。

官方网站申明Qt OpenSource版本只支持MinGW编译器,所以在安装QT之前最好先安装MinGW。不事先安装也可以,QT安装时会让你指定MinGW的安装位置,如果未安装,则QT的安装程序会引导你进行MinGW的网络安装。不过,还是建议不要使用这种方式,因为网络安装MinGW的速度比较慢,不支持断点续传。

下载MinGW的安装程序,使用官方网站https://www.360docs.net/doc/4015445569.html,/提供的安装文件MinGW-5.1.3.exe或更高版本。

2)安装MinGW

图 1.2 安装MinGW

图 1.3 选择安装包

图 1.4 选择需要安装的编译器

图 1.5 选择安装路径

图 1.6 安装完成3)安装Qt4.4

图 1.7 安装Qt

图 1.8 选择组件

图 1.9 选择安装路径

图 1.10 选择已安装MinGW的路径

图 1.11 Qt4.4安装完成

4)编译QT的Debug库

到这里,安装工作还没有完全搞定,一般都会存在两个问题:

1、把代码拿到QT安装目录之外编译,总报错,错误信息是“QtValidLicenseForGuiModule' does not name a type”。如果把代码放到QT安装目录内,则编译正常。

2、无法用Debug方式编译代码,原因是安装文件里面没带QT的Debug库。不能编译Debug程序会给以后的调试工作带来许多不便。

以上的两个问题,解决的方法是运行[开始]>[程序]>[Qt by Trolltech v4.0.1 (OpenSource)]>[Qt 4.0.1 (Build Debug Libraries)],[Qt 4.0.1 (Build Debug Libraries)],运行QT安装目录下的“bin\qtvars.bat compile_debug”。该命令有两个作用,一是重新编译生成qmake程序,二是编译生成了QT的Debug库。此时,你可以去查看一下QT安装目录下的lib目录,.a文件会多了一些以字母d结尾的库文件,这些就是QT的Debug库。

5)Hello world程序

编译一个最简单的Hello world程序,验证QT和MinGW安装无误。

QT安装目录里已经有Hello world程序的源码,在QT安装目录的

examples\tutorials\tutorial\t1\中,以命令行方式进入该目录,分别运行“qmake”命令和“make”命令,即可在release目录中生成Hello world的可执行程序,若运行“make debug”命令,则会在debug目录中以Debug编译方式生成Hello world的可执行程序。

图 1.12 Hello world程序

1.4Q t开发社区

全球各大公司以及独立开发人员每天都在加入Qt的开发社区。他们已经认识到了Qt 的架构本身便可加快应用程序开发进度。这些开发人员,无论是想开发单平台软件、还是想开发跨平台软件,都可从Qt统一而直接的API、强大的构建系统以及各种支持工具(例如Qt Designer)中受益无穷。

Qt具有一个极具活力并十分有益的用户社区,用户可以通过以下方式进行沟通:

qt-interest邮件列表、Qt Centre 网站(网址为:https://www.360docs.net/doc/4015445569.html,)以及其他社区网站和博客。另外,许多Qt开发人员也是KDE社区的活跃成员。如今,Qt的用户社区还提供了越来越多的第三方商业软件和开源软件;有关最新信息,请访问 https://www.360docs.net/doc/4015445569.html,。

Qt 的一系列文档可在线访问,网址为:https://www.360docs.net/doc/4015445569.html,。另外,有关 Qt 编程的详细介绍,市场上还有一系列英语、法语、德语、俄语、日语以及中文版本书籍。Qt的官方书籍是《C++ GUI Programming with Qt 4》(ISBN 0-13-187249-4)。

除了为C++开发人员提供综合框架以外,Qt还可以使用其他语言编程。Qt本身包含了QtScript模块,这是一种类似JavaScript的技术,使用这一技术,开发人员可以用编写脚本的方法让用户访问应用程序的某些特定区域。

奇趣科技公司还提供了Qt Jambi 这一技术,使用这种技术,Java 开发人员可以基于 Java 编程语言来使用Qt。

另外,奇趣科技公司及第三方公司针对 JavaScript、Python、Perl 和 Ruby 提供了语言绑定;其中许多解决方案都是由开源开发团队提供并加以维护的。

1.5窗体

Qt提供了一系列标准窗体,使用这些部件,可以为应用程序创建图形用户界面。Qt

的窗体灵活易用,可以进一步派生子类,以满足特殊需求。

窗体是指组合在一起创建用户界面的可视元素。按钮、菜单、滚动条、消息框以及应用程序窗口都是窗体的例子。Qt的窗体并没有在“控件”或“容器”之间加以截然区分。所有窗体既可以作为控件使用、又可以作为容器使用。通过从现有Qt窗体派生子类或者从头开始新建窗体(如有必要),则可轻松创建自定义的窗体。

标准窗体是由QWidget类及其子类提供的,而自定义窗体则可通过从标准窗体派生子类并重写虚函数的方式来创建。

窗体可以包含任意数量的子窗体。子窗体位于父窗体区域内。不含父窗体的则称为顶层窗体(“窗口”),这类窗体通常在桌面环境的任务栏中有自己的启动入口。Qt对窗体没有任何硬性限制。任何一个窗体都可以成为顶层窗体;同时任何一个窗体也可以成为其他窗体的子部件。使用布局管理器可以自动设置子窗体在父区域内的位置,如有必要,也可以手动设置。禁用、隐藏或删除父窗体时,也同样会递归地禁用、隐藏或删除其所有子窗体。

标签、消息框、工具提示以及其他文本窗体并不限定于某一种色彩、字体和语言。Qt 的文本着色窗体使用HTML的子集,可以显示丰富的多语言文本,同时大多数控件可以用一种描述性语言控制风格。

1.5.1内建窗体

图1.13展示了不同用户界面组件中所选择使用的Qt窗体。这些窗体使用Qt Designer来布局,使用Plastique样式来着色,展示了Qt 4在Linux中的标准外观。

图1.13所示窗体包括标准输入控件,例如:QLineEdit用来输入一行文本;QCheckBox用来启用/禁用简单的独立设置;QSpinBox和QSlider用来指定数量;QRadioButton用来启用/禁用互斥的设置;QComboBox表示单击时,将打开显示选择菜单。可点击的按钮则由QPushButton提供。

另外,图1.13中还显示了容器窗体,例如QTabWidget和QGroupBox。这些窗体是专门由Qt Designer管理的,可以帮助设计人员快速创建并维护新用户界面。与用户界面设计人员相比,开发人员更倾向于经常使用比较复杂的窗体(例如,图1.13“Create Poster”对话框中显示的QScrollArea),其原因是这些复杂窗体可以用来显示专业化内容或动态内容。

Qt提供的窗体远远不止此处所列出的这些。Qt的在线Widget Gallery中还提供了许多可用的窗体以及指向其类文档的链接。

图1.13 使用不同控件创建的对话框

图1.14 Qt 提供了一系列标准窗体

也可轻松使用手动方式编写用户界面。可以使用以下代码来创建“Find Text”对话框图1.13的选项组框。

QGroupBox *optionsGroupBox = new QGroupBox(tr("Options"));

QCheckBox *caseCheckBox = new QCheckBox(tr("C&ase sensitive"));

QCheckBox *directCheckBox = new QCheckBox(tr("Search fo&rwards"));

QCheckBox *wordsCheckBox = new QCheckBox(tr("Whole &words"));

QCheckBox *startCheckBox = new QCheckBox(tr("From &start of text"));

QGridLayout *optionsLayout = new QGridLayout;

optionsLayout->addWidget(caseCheckBox, 0, 0);

optionsLayout->addWidget(wordsCheckBox, 0, 1);

optionsLayout->addWidget(directCheckBox, 1, 0);

optionsLayout->addWidget(startCheckBox, 1, 1);

optionsGroupBox->setLayout(optionsLayout);

1.5.2定制窗体

通过从QWidget及其派生类派生子类,开发人员可以创建自己的窗体和对话框。为了举例说明派生子类的步骤,我们从Qt 4示例目录中列出了模拟时钟窗体的完整代码,该部件可以显示当前时间并自动更新。

AnalogClock 窗体在analogclock.h文件中定义:

#include

class AnalogClock : public QWidget

{

Q_OBJECT

public:

AnalogClock(QWidget *parent = 0);

protected:

void paintEvent(QPaintEvent *event);

};

该窗体继承通用的QWidget类,其构造函数是典型的窗体类的构造函数形式,带有一个可选的parent参数。paintEvent()函数从QWidget继承而来,此函数在任何窗体需要更新时被调用。

AnalogClock 类的实现在文件analogclock.cpp中:

#include

#include "analogclock.h"

AnalogClock::AnalogClock(QWidget *parent)

: QWidget(parent)

{

QTimer *timer = new QTimer(this);

connect(timer, SIGNAL(timeout()), this, SLOT(update()));

timer->start(1000);

setWindowTitle(tr("Analog Clock"));

resize(200, 200);

}

构造函数设置了一个定时器,给窗口设置了一个标题,并确保窗口默认大小正确合理。计时器的配置设置为每1000毫秒发送一次信号。启动计时器之前,系统使用Qt的信号和槽机制将此计时器连接至窗体的update()功能,从而确保时钟显示最新时间。

每次调用时,paintEvent()函数都会简单地将整个窗体重新绘制一次。它使用Qt的绘

图系统绘制钟表盘和时针分针。

void AnalogClock::paintEvent(QPaintEvent *)

{

static const QPoint hourHand[3] = {

QPoint(7, 8),

QPoint(-7, 8),

QPoint(0, -40)

};

static const QPoint minuteHand[3] = {

QPoint(7, 8),

QPoint(-7, 8),

QPoint(0, -70)

};

QColor hourColor(127, 0, 127);

QColor minuteColor(0, 127, 127);

int side = qMin(width(), height());

QTime time = QTime::currentTime();

该函数首先以窗体的最短边作为时钟尺寸,设置简单主体信息及色彩信息。然后在窗体的中央绘制钟表盘,并使用反锯齿(如果可用)在正确位置上绘制时针和分针。

QPainter painter(this);

painter.setRenderHint(QPainter::Antialiasing);

painter.translate(width() / 2, height() / 2);

painter.scale(side / 200.0, side / 200.0);

painter.setPen(Qt::NoPen);

painter.setBrush(hourColor);

painter.save();

painter.rotate(30.0 * ((time.hour() + time.minute() / 60.0)));

painter.drawConvexPolygon(hourHand, 3);

painter.restore();

painter.setPen(hourColor);

for (int i = 0; i < 12; ++i) {

painter.drawLine(88, 0, 96, 0);

painter.rotate(30.0);

}

painter.setPen(Qt::NoPen);

painter.setBrush(minuteColor);

painter.save();

painter.rotate(6.0 * (time.minute() + time.second() / 60.0));

painter.drawConvexPolygon(minuteHand, 3);

painter.restore();

painter.setPen(minuteColor);

for (int j = 0; j < 60; ++j) {

if ((j % 5) != 0)

painter.drawLine(92, 0, 96, 0);

painter.rotate(6.0);

}

图1.15模拟时钟示例

在此示例中,main()函数是最基本的功能。它仅仅设置了一个应用程序对象,构建并

显示了时钟窗体。最后,需要启动应用程序的事件循环,以便 Qt 可以开始处理事件:#include

#include "analogclock.h"

int main(int argc, char *argv[])

{

QApplication app(argc, argv);

AnalogClock clock;

clock.show();

return app.exec ();

}

此示例程序只包含一个顶层时钟窗体,没有任何子窗体。若要构建复杂的窗体,则需将多个窗体组合在不同布局中。

1.6信号和槽

信号和槽为对象之间的通信提供了便利条件。它们易于理解和使用,并受到Qt Designer的全面支持。

GUI应用程序要对用户操作做出响应。例如,当用户单击菜单项目或者工具栏按钮时,GUI应用程序便会执行某段代码。实际上,我们更希望任何一类对象均可彼此互相通信。编程人员必须将事件与相关代码相关联。老的开发工具套件(Toolkit)使用的机制不是类型安全(type-safe)的(例如,容易引起崩溃),缺乏灵活性而且不是面向对象的。

奇趣科技公司创造了一种名为“信号和槽”的解决方案。信号和槽机制是一种功能强大的对象间通信机制,完全可以取代老旧的开发套件所使用的粗糙的回调和消息映射。信号和槽机制极为灵活,完全面向对象,并且使用 C++ 来实现。

使用原有回调机制,若要将某一代码与按钮关联在一起,必须将函数指针传输给该按钮。单击此按钮时,系统将调用此函数。而对于老的工具套件而言,调用此函数时,它不确保将正确类型的参数传递给该函数,这样很有可能导致崩溃。回调方法的另一问题是:它将GUI 元素与功能紧紧地捆绑在一起,这样导致很难独立开发类。

而Qt的信号和槽机制则不同。发生事件时,Qt窗体将会发出信号。例如,单击某一按钮时,该按钮将发出“clicked”信号。编程人员要想连接一个信号可以创建一个函数(即“槽”)、并调用connect()函数将信号与槽关联起来。Qt的信号和槽机制不要求各类彼此感知,这样可以更轻松地开发极易重新使用的类。由于信号和槽都属于类型安全的,因此,类型错误都将报告为警告,因此不会发生崩溃。

例如,如果“退出”按钮的clicked()信号与应用程序的quit()槽相连,那么如果用户单击“退出”,则会终止该应用程序。如果以代码形式表示,则应将上述过程编写为:

connect(button, SIGNAL(clicked()), qApp, SLOT(quit()));

在执行Qt应用程序的过程中,可以随时添加或移除连接。可将连接设置为在发出信号时执行,或者排队稍后执行,可以在不同的线程的对象之间建立连接。

信号和槽通过平滑的扩展C++语法并充分利用C++的面向对象特性实现。信号和槽是类型安全的,可以重载,也可以重新实现,可以出现在类的公有区、保护区或私有区。若要使用信号和槽,必须继承QObject或其子类,并在类的定义中包括Q_OBJECT宏。信号在类的“信号区”声明,而槽则是在“公有槽区”、“保护槽区”或“私有槽区”中声明的。

1.6.1信号和槽示例

以下是 QObject 子类的示例:

class BankAccount : public QObject

{

Q_OBJECT

public:

BankAccount() { curBalance = 0; }

int balance() const { return curBalance; }

public slots:

void setBalance(int newBalance);

signals:

void balanceChanged(int newBalance);

private:

int currentBalance;

};

与多数C++ 类的风格类似,BankAccount类拥有构造函数、balance()“读取”函数和 setBalance()“设置”函数。它还拥有balanceChanged()信号,帐户余额更改时将发出此信号。发出信号时,与它相连的槽将被执行。

Set函数是在公共槽区中声明的,因此它是一个槽。槽既可以作为成员函数,与其他任何函数一样调用,也可以与信号相连。以下是setBalance()槽的实现过程:

void BankAccount::setBalance(int newBalance)

{

if (newBalance != currentBalance) {

currentBalance = newBalance;

emit balanceChanged(currentBalance);

}

}

语句emit balanceChanged(currentBalance); 将发出balanceChanged()信

号,并使用当前新余额作为其参数。

关键字emit类似于“signals”和“slots”,由Qt提供,并由C++预处理器转换成标准C++ 语句。

以下示例说明如何连接两个BankAccount对象:

BankAccount x, y;

connect(&x, SIGNAL(balanceChanged(int)), &y, SLOT(setBalance(int)));

x.setBalance(2450);

当x中的余额设置为2450时,系统将发出balanceChanged()信号。y中的setBalance()槽收到此信号后,将y中的余额设置为2450。一个对象的信号可以与多个不同槽相连,多个信号也可以与特定对象中的某一个槽相连。参数类型相同的信号和槽可以互相连接。槽的参数个数可以少于信号的参数个数,这时多余的参数将被忽略。

图 1.16信号和槽连接的示例

1.6.2元对象编译器

信号和槽机制是采用标准C++来实现的。该实现使用C++预处理器和Qt所包括的moc(即:元对象编译器)。元对象编译器读取应用程序的头文件,并生成必要的代码,以支持信号和槽机制。qmake生成的Makefiles将自动调用元对象编译器。开发人员无需编辑、甚至无需查看生成的代码。

除了处理信号和槽以外,元对象编译器还支持Qt的翻译机制、属性系统及其扩展的运行时类型信息。它还使C++程序进行运行时自检成为可能,并可在所有支持的平台上工作。

1.7G UI 应用程序

使用Qt可以轻松快速地构建流行的GUI应用程序,通过手工编码或使用Qt的可视设计工具Qt Designer即可完成。

Qt提供了创建现代GUI应用程序所需的所有类和函数。使用Qt,可以创建“主窗口”样式的应用程序(其中心区域周围含有菜单栏、工具栏以及状态栏)和“对话框”样式的应用程序(这些应用程序使用按钮或选项卡来显示选项和信息)。Qt既支持SDI(单一文档界

面)、又支持MDI(多文档界面)。Qt还持拖放操作以及剪贴板。图 1.17显示了一个应用程序主窗口和TextEdit控件,该主窗口中包含主菜单、工具栏和围绕着中心窗体的停靠窗口。

图 1.17 Qt 4 主窗口示例

工具栏可以在工具栏区域内移动,也可以拖到其他区域,还可以作为工具板浮动。此功能为内建功能,无需任何附加代码。当然,如有需要,编程人员可以对工具栏的行为加以限制。

Qt使编程变得更简易。例如,如果某一菜单选项、工具栏按钮以及键盘快捷键都执行同一操作,那么只需为该操作编写一次代码。

Qt还支持消息框、向导页和所有标准对话框,这样方便应用程序向用户提出问题,并让用户选择文件、文件夹、字体和色彩。实际上,若要显示消息框或标准对话框,则只需编写一行语句,该语句使用Qt某一静态函数即可。

使用系统注册表或文本文件,Qt可以采用与平台无关的方式存储应用程序的设置,从而记录项目(例如,用户首选项、最近使用的文件、窗口以及工具栏位置和大小),供稍后使用。

Qt通过一组代表通用构造方式的类支持多线程编程,这样Qt的程序可以充分利用多线程来执行计算、耗时任务或加快响应速度。应用程序也可使用Qt的桌面集成功能与用户桌面环境提供的服务进行交互。

1.7.1主窗口

QMainWindow类为典型应用程序的主窗口提供了一个框架。主窗口包含一系列标准控件。主窗口的顶部是一个菜单栏,菜单栏下面是工具栏,整个工具栏区域位于窗口顶部、左侧、右侧以及底部。状态栏则位于底部工具栏区域下的主窗口区域中。工具提示和“这是什么?”帮助为用户界面元素提供了气球帮助。

对于SDI应用程序,QMainWindow的中心区域可以包含任何窗体。例如,文本编辑器可以使用QTextEdit作为中心窗体:

QTextEdit *editor = new QTextEdit(mainWindow);

mainWindow->setCentralWidget(editor);

对于MDI应用程序,中心区域通常放置一个QMdiArea窗体,并包含若干QMdiSubWindow窗体。

1.7.2菜单

QMenu窗体以垂直列表的方式向用户展示菜单项目。菜单既可以单独显示(例如,上下文弹出菜单)、可以显示在菜单栏上、也可以成为另一弹出菜单的子菜单。菜单可以具有tear-off handle。

每个菜单项目都可拥有图标、复选框和快捷键。通常,菜单项目与动作相对应(例如,“保存”)。分隔符项显示为一条横线,可以用来将相关动作采用可视方式集中在一起。下面我们举例说明如何创建带有“新建”、“打开”和“退出”菜单项目的“文件”菜单:

QMenu *fileMenu = new QMenu(this);

fileMenu->addAction(tr("&New"), this, SLOT(newFile()), tr("Ctrl+N");

fileMenu->addAction(tr("&Open..."), this, SLOT(open()), tr("Ctrl+O"));

fileMenu->addSeparator();

fileMenu->addAction(tr("E&xit"), qApp, SLOT(quit()), tr("Ctrl+Q"));

选中菜单项目时,系统将执行对应的槽。请注意:在此情况下,tr()函数将采用用户的本地语言来获取菜单文本。

QMenuBar类实现了菜单栏。菜单栏会自动位于父窗体(通常是指QMainWindow)的顶部,如果父窗口不够宽,则其内容将分为几行排列。Qt的布局管理器可以管理任何菜单栏。在Macintosh系统中,菜单栏出现在屏幕顶部。下面我们举例说明如何创建带有“文件”、“编辑”和“帮助”菜单的菜单栏:

QMenuBar *menuBar = new QMenuBar(this);

menuBar->addMenu(tr("&File"), fileMenu);

menuBar->addMenu(tr("&Edit"), editMenu);

menuBar->addMenu(tr("&Help"), helpMenu);

Qt的菜单十分灵活,是整个集成“动作”系统(action system)的一个组成部分。您可启用或禁用任何动作,也可将操作动态添加至菜单中,稍后再移除该动作。

1.7.3工具栏

工具栏包含各种按钮以及用户执行操作相关的其他控件。可以随意在主窗口中央区域的顶部、左侧、右侧以及底部移动工具栏。任何工具栏均可从工具栏区域中拖出,并可作为独立的工具板浮动。

QToolButton 类实现了带有图标、不同风格的边框以及可选文字标签的工具栏按钮。切换(toggle)工具栏按钮负责开关功能,其他工具栏按钮则负责执行命令。活动模式、禁用模式、启用模式以及开/关状态均使用不同图标表示。如果只有一个图标,那么Qt将

QT中的网络编程实例

QT中的网络编程实例 Qclient.h /**************************************************************************** ** $Id: /sample/10/qclient.h 2.3.2 edited 2004-10-12 $ ** ** Copyright (C) 2004-2005 OURSELEC AS. All rights reserved. ** https://www.360docs.net/doc/4015445569.html, ** This file is part of an example program for Qt. This example ** program may be used, distributed and modified without limitation. ** *****************************************************************************/ #ifndef QCLIENT_H #define QCLIENT_H #include #include #include #include #include #include #include #include #include class QClient : public QWidget { Q_OBJECT public: QClient(QWidget *parent = 0, const char *name = 0); private slots: void closeConnection(); void sendToServer(); void connectToServer(); void socketReadyRead(); void socketConnected(); void socketConnectionClosed(); void socketClosed(); void socketError(int); private: QSocket *socket; QTextView *infoText;

嵌入式Linux下用Qt Designer开发及实例

嵌入式Linux用Qt Designer快速开发 RAD(快速应用程序开发)是一种高效的软件开发形式,可以让用户在极短的时间里创建一个图形化的用户界面。通常情况下,在一张空白的表单上,开发人员可以通过拖拉或点击的方式,在窗口的适当位置上添加一些输入框和按钮等窗口组件。这时,RAD工具会自动编写和维护代码。而用户所要做的只是确定当点击按钮或选择选单选项时将要发生什么事件。 在Linux下,一个非常流行的RAD工具就是Qt Designer。它是嵌入式公司Trolltech 的Qt软件包的一个组成部分。如果用户使用的是KDE桌面,那么Qt已经自动安装上了,Qt Designer也很有可能已经被安装好。如果用户的系统没有安装,那么针对不同的版本,可以很方便地找到KDE Development Tools,并安装之。以Red Hat 9.0为例,用户可以从主选单→系统设置→添加/删除应用程序中选择KDE 软件开发,即可完成Qt Designer的安装(如图1所示)。 图1 安装Qt Designer 创建 为了快速地向大家展示一下Qt Designer功能,先创建一个简单的摄氏温度和华氏温度的转换程序。本文里将设计一个简单的GUI,并且添加一些简单的代码来实现温度的转换。因为是为了展示一下快速的开发过程,而不是一个严谨的软件项目的开发,所以这里不会进行任何的错误检查,也不进行输入检验(也就是检查用户的输入是否为合法的温度形式)、缓冲溢出检查等在日常软件开发中一定要做的步骤。

如果用户使用的是KDE,那么选单上应该已经有Qt Designer的图标。不同的发行版,图标的位置会有所不同。如果用户的发行版没有Qt Designer图标,那么可以在命令行模式下输入“designer”命令来启动该开发工具。在Red Hat 9.0中,可以通过点击主选单→编程→更多编程工具→Qt Designer来启动(如图2)。 图2 启动Qt Designer Qt Designer首先呈现给用户的是一个New/Open对话框(如图3所示)。因为这里要创建一个C++程序,所以在此选择C++ Project,点击“OK”继续。 图3 New/Open对话框 选择一个想要保存文件的位置,并且给出一个文件名,在此使用的文件名是cfconv。注意这里文件名的扩展名一定要是.pro。点击“Save”后,返回到了Project

让Qt应用程序只运行一个实例 - 开源中国社区

首页 开源项目 Java 开源软件 C# 开源软件 PHP 开源软件 C/C++ 开源软件 Ruby 开源软件 Python 开源软件 Go开源软件 JS开源软件 问答 技术问答 ? 技术分享 ? IT大杂烩 ? 职业生涯 ? 站务/建议 ? 支付宝专区 ? MoPaaS专区 ? 开源硬件专区 ? 代码 博客 翻译 资讯 移动开发 Android开发专区 iOS开发专区 iOS代码库 Windows Phone 招聘 城市圈 你还没加入城市圈 全部城市圈xuyanghpu,您好 我的空间 站内留言 我的讨论记录 我分享的代码 我的博客 我关注的人 我的收藏夹 个人资料修改 更改我的头像 | 添加软件 | 投递新闻 | 退出开源中国 代码分享 当前位置:

分享到: 收藏 +15踩顶0[全屏查看所有代码]代码分享 ? C/C++ ? 图形界面开发/GUI/CGI 资讯、软件、分享、代码、搜 索 让Qt应用程序只运行一个实例 鉴客 发布于 2010年10月21日 17时, 2评/5284阅 在实际应用中,我们经常需要让应用程序只有一个实例,再打开新的文档或者页面时,只是替换现在的窗口或者新打开一个标签,而不是重新启动一次应用程序。Qt中是否可以做到这样呢,答案是肯定的,因为Qt本身可以直接调用系统API,肯定可以做到,但是我们希望找到一个跨平台的通用的解决方案。这就要用到Qt的QLocalSocket,QLocalServer类了,这两个类从接口上看和网络通信socket没有区别,但是它并不是真正的网络API,只是模仿了而已。这两个类在Unix/Linux系统上采用Unix域socket 实现,而在Windows上则采用有名管道(named pipe)来实现。 既然是网络API,那么思路就很简单了,应用程序启动时首先会去连一个服务器(这里通过应用程序的名字来标识,就像网络端口一样),如果连接失败,那么则自己是第一个实例,就创建这么一个服务器,否则将启动参数发送到服务器,然后自动退出,而服务器会在收到通知以后进行处理。 这些动作我想最好是放在创建Application实例后,因为Qt本身有很多操作没有Application实例是无法进行操作的(至少事件循环是在创立Application以后才能启动吧),因此最好的位置就是通过继承QApplicaiton或者QCoreApplication自定义一个YourOwnApplication,然后在构造函数中进行,下面是一个示意。 首先是YourOwnApplication构造函数: 标签: QApplicaiton QLocalSocket QLocalServer Qt 代码片段(1) 1. [代码]cpp代码 1234567891011121314151617Q S t r i n g s e r v e r N a m e = Q C o r e A p p l i c a t i o n ::a p p l i c a t i o n N a m e (); Q L o c a l S o c k e t s o c k e t ;s o c k e t .c o n n e c t T o S e r v e r (s e r v e r N a m e ); i f (s o c k e t .w a i t F o r C o n n e c t e d (500)) { //如果能够连接得上的话,将参数发送到服务器,然后退 Q T e x t S t r e a m s t r e a m (&s o c k e t ); Q S t r i n g L i s t a r g s = Q C o r e A p p l i c a t i o n ::a r g u m e n t s (); i f (a r g s .c o u n t () > 1) s t r e a m << a r g s .l a s t (); e l s e s t r e a m << Q S t r i n g (); s t r e a m .f l u s h (); s o c k e t .w a i t F o r B y t e s W r i t t e n (); q A p p ->q u i t (); ?

Qt界面美工实例

Qt StyleSheet样式表实例 在涉及到Qt 美工的时候首先需要掌握CSS 级联样式表。 下面将通过几个例子来介绍一下怎样使用Qt中的部件类型设计。自定义的前台背景与后台背景的颜色: 如果需要一个文本编辑器的背景变为黄色,下面是代码行: qApp->setStyleSheet("QLineEdit { background-color: yellow }"); 针对一个对话框的内容中使用QLineEdit以及QLineEdit的子类的背景都变成黄色,下面是代码: myDialog ->setStyleSheet("QLineEdit { background-color: yellow }"); 如果只需要制定一个QLineEdit的内容,将使用QObject::setObjectName() 下面是一个实例: myDialog->setStyleSheet("QLineEdit#nameEdit { background-color: yellow }"); 同时也可以针对每一个指定的部件做直接的类型设置,下面是一个实例: https://www.360docs.net/doc/4015445569.html,Edit->setStyleSheet("background-color: yellow"); 为了做一个鲜明的对比,将要为文本设置合适的颜色。 nameEdit->setStyleSheet("color: blue; background-color: yellow"); 当然最好的办法还有针对选择的文本来进行设置,下面设置了一个选择文本的类型属性:nameEdit->setStyleSheet("color: blue;" "background-color: yellow;" "selection-color: yellow;" "selection-background-color: blue;"); 在有一些情况下,不需要用户参与,而有软件设计人员来自己制定样式,即使这些是有违审美角度。下面就从应用程序开发角度来设计样式。 *[mandatoryField="true"] { background-color: yellow } 上面的意思是一些强制的区域是需要用Qt 的属性管理来强制设置成为黄色的背景。 这样一些强制的部件,将需要通过函数来设置当前的属性已经被强制设置,下面是实现的代码:

如何在Qt中使用Qt 3D开发程序

如何使用Qt 3D开发3D场景程序? 目前Qt已经提供大量的3D API的支持了,作为对OPENGL的一种补充,QT 3D使用起来更加方便,并且跨平台。但是Qt中关于QT 3D的文档并不是很全面。很多初学者包括我自己现在都是摸索着前进的。网上虽然也有教程,但是却都是让人云里雾里不知所以然的。不过以后会好很多的了,因为Qt即将发布qt3DStudio了,有了这个工具,咱们以后开发qt3D 的程序时就容易上手了。 首先我们需要找到Qt 3D的帮助文档,我们直接在QtCreator中搜索qt3d,然后就可以看到和3D相关的文档了。这里我们类比一下其他3D程序的开发工具,譬如Unity3D,采用C#语言开发,而QtStudio以后就应该是C++和QML开发了,所以大家如果没用过Unity3D,也可以去下载一个试试看,建立一个初步的认识。

然后我们还需要查看Qt3D的案例,这些案例里面有一些图片和材料文件,估计初学者都不知道是什么东西,如果我们要仿照案例去写自己的程序,又该如何入手呢?这里我们需要两个工具,一个是blender,Linux下最流行的3D建模软件,blender也可以在MAC和Windows 上使用,因为它是跨平台的。大家可以直接使用sudo apt-get install blender进行安装。 Blender软件是用来查看Qt 3D例子中资源文件中的obj材料文件的,如下图。我们可以使用blender打开这些obj文件,也可以自己动手做一些材料,然后导出为obj文件。导入导出见下图。

然后我们在上面还看到一种图片,这种图片格式很新颖,我还是第一次见,估计初学者很多也是第一次见吧。所以既然Qt用到了,咱们仿写程序的时候,没有这个图片可就不好办了。所以这里我们还要另一工具,cwebp,大家可以使用sudo apt-get install webp安装即可。Webp 格式的图片是谷歌开发的一种新型的比jpg,png等图片更适合在网络上进行传输的图片,将来估计会广泛使用的,这里我们就先跟着QT尝个鲜吧。

相关主题
相关文档
最新文档