嵌入式软件开发技术:Qt GUI开发_第1页
嵌入式软件开发技术:Qt GUI开发_第2页
嵌入式软件开发技术:Qt GUI开发_第3页
嵌入式软件开发技术:Qt GUI开发_第4页
嵌入式软件开发技术:Qt GUI开发_第5页
已阅读5页,还剩70页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Qt GUI开发开发 参考书目:参考书目:ARM嵌入式嵌入式Linux系统开系统开发从入门到精通发从入门到精通一、一、 Qt概述概述 1、Linux下的下的GUI介绍介绍 GUI是是Graphical User Interface的缩写,即图形用户接口,一般的缩写,即图形用户接口,一般由视窗、图标、菜单、对话框及其他一些可视特征组成。允许终端用由视窗、图标、菜单、对话框及其他一些可视特征组成。允许终端用户方便地利用鼠标和键盘来操作电脑。户方便地利用鼠标和键盘来操作电脑。 GUI的概念是的概念是20世纪世纪70年代由施乐公司提出的,年代由施乐公司提出的,1984年苹果的年苹果的Macintosh

2、首先成功使用首先成功使用GUI并应用于商业用途的产品。之后各种并应用于商业用途的产品。之后各种GUI系统发展迅速,包括后来居上的微软的系统发展迅速,包括后来居上的微软的Windows系列,以及广泛应用系列,以及广泛应用于类于类UNIX系统的的系统的的X Windows(常简称为(常简称为X11或或X)一、一、 Qt概述概述1.1 Linux桌面桌面GUI系统系统Linux环境下的图形视窗标准环境下的图形视窗标准为为X Window System,Linux是类是类UNIX系统,顶层运行的系统,顶层运行的GUI系统是系统是兼容兼容X标准的标准的XFree86系统。系统。X标准标准大致可以划分大致

3、可以划分X Server、Graphic Library(底层绘图函数库)、(底层绘图函数库)、Toolkits、Window Manager等几大等几大部分。其好处是具有可扩展性、可部分。其好处是具有可扩展性、可移植性等优点。在所有类移植性等优点。在所有类UNIX系统系统中,中,X Window几乎完全占据统治地几乎完全占据统治地位。位。桌面整合环境桌面整合环境(Gnome, KDE等等)高级图形库和开发包高级图形库和开发包(Gtk+, Qt等等)X Windows系统底层系统底层API(Xlib)X Windows系统协议实现层系统协议实现层常见的常见的Linux桌面桌面GUI系系统框架统

4、框架一、一、 Qt概述概述1.1 Linux桌面桌面GUI系统系统X Windowp X起源于起源于1984年麻省理工学院计算机科学研究所和年麻省理工学院计算机科学研究所和Athena计划的共计划的共同研究同研究,其基础是从斯坦福大学得到的一套叫做其基础是从斯坦福大学得到的一套叫做W的实验性视窗系的实验性视窗系统,并在基于统,并在基于W的基础上开始发展,当发展到足以和原先系统有明的基础上开始发展,当发展到足以和原先系统有明显区别时,他们把这个系统叫做显区别时,他们把这个系统叫做X。p 1987年年9月月X视窗系统第视窗系统第11个版本即个版本即X11发行,并取得显著成功,成发行,并取得显著成功

5、,成为早期的较大规模开源项目之一。后来的为早期的较大规模开源项目之一。后来的X发行的版本都被称为发行的版本都被称为X11的某个版本的某个版本,如如X11R2、X11R6等。这也是等。这也是X Window系统常被系统常被简称为简称为X11的原因。的原因。一、一、 Qt概述概述1.1 Linux桌面桌面GUI系统系统X Windowp X Window系统架构基于系统架构基于C/S模型,主要由模型,主要由X Server和和X Client通过通过X Protocol在网络上通信完成应用任务。当然,在很多情况下,在网络上通信完成应用任务。当然,在很多情况下, X Server和和X Client

6、运行在同一主机上,这时它们之间的通信只需利运行在同一主机上,这时它们之间的通信只需利用本地的一些通信方式。用本地的一些通信方式。p X Window为为GUI环境提供了基本的框架:在屏幕上绘图和移动窗环境提供了基本的框架:在屏幕上绘图和移动窗口,以及与鼠标和键盘的互动等。口,以及与鼠标和键盘的互动等。X Server用来控制显示器和输入用来控制显示器和输入设备,它可以建立视窗,在视窗中画图和文字,响应设备,它可以建立视窗,在视窗中画图和文字,响应Client程序的程序的请求;而请求;而X Client就是就是X中的应用程序,主要完成应用程序计算处中的应用程序,主要完成应用程序计算处理的部分,并

7、不接受用户的输入信息,输入信息都是输入给理的部分,并不接受用户的输入信息,输入信息都是输入给X Server,然后由,然后由X Server以以Event的形式传递给的形式传递给X Client。一、一、 Qt概述概述1.1 Linux桌面桌面GUI系统系统GNOME/Gtk+和和KDE/Qtp X Window本身不是一个直接的图形操作环境,它只是作为图形环本身不是一个直接的图形操作环境,它只是作为图形环境与境与UNIX系统内核沟通的中间桥梁,任何厂商都可以在系统内核沟通的中间桥梁,任何厂商都可以在X Window基础上开发出不同的基础上开发出不同的GUI图形环境。图形环境。p 就读于图宾根

8、大学的德国人就读于图宾根大学的德国人Matthias Ettrich发起了发起了KDE(K Desktop Environment)计划,并选择了当时新推出的功能强大的计划,并选择了当时新推出的功能强大的Qt作为作为GUI开发包。开发包。p KDE本身采用本身采用GPL,而作为,而作为KDE底层基础的底层基础的Qt却是不遵循却是不遵循GPL的的商业软件,于是一大批自由程序员对商业软件,于是一大批自由程序员对KDE项目的决定深为不满,项目的决定深为不满,在墨西哥程序员在墨西哥程序员Miguel De Icaza的组织下发起了的组织下发起了GNOME计划来替计划来替代代KDE,并选择,并选择Gtk

9、+作为作为Qt开发包的替代,担当开发包的替代,担当GNOME的基础的基础。一、一、 Qt概述概述1.1 Linux桌面桌面GUI系统系统GNOME/Gtk+和和KDE/Qtp KDE和和GNOME在之后多的年相互竞争中迅速发展,逐渐成为在之后多的年相互竞争中迅速发展,逐渐成为Linux下桌面环境的两大阵营。目前下桌面环境的两大阵营。目前GNOME/Gtk+吸引的公司较多吸引的公司较多, 而而KDE/Qt在在Office/嵌入式环境中领先一步。嵌入式环境中领先一步。p 从从2003年以来,年以来,KDE和和GNOME开始逐渐相互支持对方的程序开始逐渐相互支持对方的程序只要在只要在KDE中安装中安

10、装GTK库,便可以运行库,便可以运行GNOME的程序,反之亦的程序,反之亦然。经过几年的努力,然。经过几年的努力,KDE和和GNOME都已经实现高度的互操作性都已经实现高度的互操作性,两大平台的程序都是安全共享的。,两大平台的程序都是安全共享的。一、一、 Qt概述概述1.2 Qt/X11介绍介绍p 1991年,年,Qt的两位创始人就开始着手开发的两位创始人就开始着手开发Qt,到,到1994年年Qt已基本已基本成型,于是他们成立了成型,于是他们成立了Trolltech(奇趣)公司,开始用(奇趣)公司,开始用Qt开发应用开发应用软件。软件。p 作为跨平台的作为跨平台的GUI开发包,开发包, Qt发

11、行了不同的版本以支持各种流行发行了不同的版本以支持各种流行的操作系统,如微软的的操作系统,如微软的Windows系列、基于系列、基于X的各种的各种UNIX系统、系统、苹果的苹果的Mac OS X及带有及带有Frambuffer支持的嵌入式支持的嵌入式Linux系统等。其系统等。其中支持基于中支持基于X11的类的类UNIX系统的版本我们常简称为系统的版本我们常简称为Qt/X11。p 在在GNOME和和KDE的竞争中,的竞争中,Trolltech公司被迫数次修改公司被迫数次修改Qt的版权的版权,直到,直到2000年年10月遵循月遵循GPL发布了发布了Qt自由版用于自由版用于X11,在,在Q公共许公

12、共许可证和可证和GPL下可以免费使用。可以到下可以免费使用。可以到Trolltech公司的官方网站公司的官方网站http:/下载下载Qt/X11的安装包。的安装包。一、一、 Qt概述概述1.3 Qt/Embedded介绍介绍p Qt/Embedded是是Trolltech公司为嵌入式系统开发的公司为嵌入式系统开发的Qt版本,从版本,从Qt4.1开始改名为开始改名为Qtopia Core,从,从Qt4.4.1版本开始,又改名为版本开始,又改名为Qt for Embedded Linux。p Qt/X11与与Qtopia Core系统框架的对比系统框架的对比二、二、 Qt/X11初步初步2.1 Q

13、t/X11的安装的安装p 下载及双重授权问题下载及双重授权问题 Qt/X11自由版可以在自由版可以在Trolltch公司的主页下载。公司的主页下载。 Qt/X11目前采用双重版权的方式来授权,即分为自由版和商业版,目前采用双重版权的方式来授权,即分为自由版和商业版,使用自由版开发的应用程序需要公开源代码及遵循使用自由版开发的应用程序需要公开源代码及遵循GPL和和QPL的一的一些其他约束。因此,如果用些其他约束。因此,如果用Qt开发商业软件的开发者不希望开放源开发商业软件的开发者不希望开放源代码,则可以使用代码,则可以使用Trolltech提供的提供的Qt的商业版本,这种授权方式不的商业版本,这

14、种授权方式不再受再受GPL的约束。的约束。二、二、 Qt/X11初步初步2.1 Qt/X11的安装的安装p Qt/X11安装详解安装详解 假设已经将压缩包假设已经将压缩包qt-x11-opensource-src-4.2.2.tat.gz下载到本机的下载到本机的/home/user_name/下。下。解压缩包:解压缩包:#tar xzvf qt-x11-opensource-src-4.2.2.tat.gz解压后会生成解压后会生成/home/user_name/qt-x11-opensource-src-4.2.2目录,安装目录,安装Qt所需要的文件都在这个目录下。所需要的文件都在这个目录下。

15、运行配置程序:运行配置程序:#cd qt-x11-opensource-src-4.2.2#./configure询问是不是同意询问是不是同意GPL/QPL协议的问题,回答协议的问题,回答yes后就可以继续了。后就可以继续了。 configure可以用来配置很多安装选项,可以通过可以用来配置很多安装选项,可以通过“./configure help”查查看配置选项及说明。看配置选项及说明。二、二、 Qt/X11初步初步2.1 Qt/X11的安装的安装p Qt/X11安装详解安装详解编译编译Qt源代码源代码上一步骤完成后,在上一步骤完成后,在/home/user_name/qt-x11-opens

16、ource-src-4.2.2目录目录下生成了下生成了Makefile文件,本步骤中用文件,本步骤中用make命令来编译命令来编译Qt需要的共享库、需要的共享库、工具及例子等,这一步骤需要相当长的时间。工具及例子等,这一步骤需要相当长的时间。#make安装安装Qt#make install安装安装Qt到默认的路径到默认的路径/usr/local/Trolltech/Qt-4.2.2。完成后可以在安装上。完成后可以在安装上当下看到当下看到Qt的头文件、库文件、工具及例子程序等。的头文件、库文件、工具及例子程序等。二、二、 Qt/X11初步初步2.1 Qt/X11的安装的安装p Qt/X11安装详

17、解安装详解设置环境变量设置环境变量修改修改$HOME/.bash_profile中的相关设置中的相关设置:# vi $HOME/.bash_profileexport QTDIR=usr/local/Trolltech/Qt-4.2.2export PATH=$QTDIR/bin:$PATHexport LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH修改完成后用修改完成后用source命令重新运行修改后的脚本命令重新运行修改后的脚本 :#source $HOME/.bash_profile二、二、 Qt/X11初步初步2.2 Qt下的下的Hellowor

18、ldp 源文件源文件helloworld.cpp QLabel是是Qt控件集中的一员。控件集中的一员。Qt中所有控件都是中所有控件都是QWidget的子类,的子类,它们都能作为程序的主窗口。它们都能作为程序的主窗口。#include #include int main(int argc, char *argv) QApplication app(argc, argv); QLabel hello(Hello world QLabel!); hello.show(); return app.exec();二、二、 Qt/X11初步初步2.2 Qt下的下的Helloworldp Qt应用程序的编译

19、应用程序的编译 一般不直接用一般不直接用gcc命令或者直接编写命令或者直接编写 Makefile来编译来编译Qt的源代码,的源代码,因为因为Qt中有一些对中有一些对C+的扩展,手工写的话会比较麻烦。通常利用的扩展,手工写的话会比较麻烦。通常利用Qt提供的提供的qmake工具来编译工具来编译Qt的源代码:的源代码:#qmake project该工具自动生成了该工具自动生成了文件;文件;#qmake本步生成本步生成Makefile文件,然后用文件,然后用make进行编译、运行:进行编译、运行:#make#./helloworld二、二、 Qt/X11初步初步2.3 温度

20、转换小程序温度转换小程序p 背景知识背景知识摄氏温度(摄氏温度(C)和华氏温度()和华氏温度(F)的换算关系:)的换算关系:F=(C*9/5)+32C=(F-32)*5/9二、二、 Qt/X11初步初步2.3 温度转换小程序温度转换小程序p 程序结构与程序结构与Quit按钮按钮任务:任务:搭建温度转换程序的主结构,并创建一个搭建温度转换程序的主结构,并创建一个Quit按钮,用来退出按钮,用来退出程序。程序。程序结构:程序结构:1)main()函数:程序的入口函数,定义一个函数:程序的入口函数,定义一个QApplication对象来将控对象来将控制权交给制权交给Qt.2) ConversionS

21、creen类:绘制窗口。类:绘制窗口。文件构成:文件构成:main.cpp, ConversionScreen.h, ConversionScreen.cpp二、二、 Qt/X11初步初步2.3 温度转换小程序温度转换小程序p 程序结构与程序结构与Quit按钮按钮main.cpp#include #include ConversionScreen.hint main(int argc,char *argv) QApplication app(argc,argv); ConversionScreen screen; screen.show(); return app.exec();二、二、 Qt

22、/X11初步初步2.3 温度转换小程序温度转换小程序p 程序结构与程序结构与Quit按钮按钮ConversionScreen.h#ifndef CONVERSION_SCREEN_H#define CONVERSION_SCREEN_H#include class ConversionScreen:public QWidgetpublic:ConversionScreen();ConversionScreen();private:void createScreen();#endif二、二、 Qt/X11初步初步2.3 温度转换小程序温度转换小程序p 程序结构与程序结构与Quit按钮按钮Conv

23、ersionScreen.cpp#include #include #include ConversionScreen.hConversionScreen:ConversionScreen():QWidget()createScreen();void ConversionScreen:createScreen()QPushButton* quit = new QPushButton(Quit,this);connect(quit,SIGNAL(clicked(),qApp,SLOT(quit();二、二、 Qt/X11初步初步2.3 温度转换小程序温度转换小程序p 程序结构与程序结构与Quit

24、按钮按钮ConversionScreen.cpp QWidget的构造函数:的构造函数:QWidget(QWidget* parent=0, Qt:WindowFlags f=0)第一个参数用来指定父部件,默认值第一个参数用来指定父部件,默认值0表示为顶级部件;表示为顶级部件;第二个参数指定部件风格,第二个参数指定部件风格,0表示普通风格。表示普通风格。 QPushButton构造函数:构造函数:QPushButton(const QString& text,Qwidget* parent=0);二、二、 Qt/X11初步初步2.3 温度转换小程序温度转换小程序p 程序结构与程序结构与

25、Quit按钮按钮ConversionScreen.cpp 将按钮将按钮quit的的clicked()信号连接到信号连接到qApp的槽的槽quit():connect( quit,SIGNAL(clicked(),qApp,SLOT(quit();connect()是是QObject类所提供的成员函数,而类所提供的成员函数,而QObject类是所有类是所有Qt类类的基类,所以它可以方便地在各处应用,其用法如下:的基类,所以它可以方便地在各处应用,其用法如下:connect(sender,SIGNAL(signal),receiver, SLOT(slot);sender和和receiver是指向

26、是指向QObject对象的指针,对象的指针,sender发射信号发射信号signal, receiver接收到信号后执行接收到信号后执行slot。SIGNAL和和SLOT类似两个关类似两个关键字,来标志信号和槽。键字,来标志信号和槽。qApp指向指向QApplication对象的指针,作为对象的指针,作为SLOT的的quit()函数是函数是QApplication的成员函数,调用它将退出的成员函数,调用它将退出Qt的循环等待。的循环等待。二、二、 Qt/X11初步初步2.3 温度转换小程序温度转换小程序p 摄氏温度的显示摄氏温度的显示QSlider部件与窗体布局部件与窗体布局 用用QSlide

27、r模拟温度计,并用模拟温度计,并用QLabel显示温度计数。显示温度计数。创建创建QSlider对象:对象:QSlider* slider = new QSlider(Qt:Vertical);slider-setRange(0,100);slider-setValue(0);slider-setTickPosition(QSlider:TicksLeft);创建创建QLabel对象:对象:QLabel* label = new QLabel(0);二、二、 Qt/X11初步初步2.3 温度转换小程序温度转换小程序p 摄氏温度的显示摄氏温度的显示QSlider部件与窗体布局部件与窗体布局 布局

28、窗体部件:布局窗体部件:lQHBoxLayout:在水平方向上从左到右(默认)或者从右到左在水平方向上从左到右(默认)或者从右到左布置部件;布置部件;lQVBoxLayout:在竖直方向上从上往下(默认)或者从下往上在竖直方向上从上往下(默认)或者从下往上布置部件;布置部件;lQGridLayout:以网格形式布局部件。以网格形式布局部件。二、二、 Qt/X11初步初步2.3 温度转换小程序温度转换小程序p 摄氏温度的显示摄氏温度的显示QSlider部件与窗体布局部件与窗体布局 布局窗体部件:布局窗体部件: QHBoxLayout* cLayout = new QHBoxLayout; cLa

29、yout-addWidget(label, 0, Qt:AlignRight);/第第2个参数个参数/表示不作任何伸展变化表示不作任何伸展变化 cLayout-addWidget(slider, 0, Qt:AlignLeft); QVBoxLayout* mainLayout = new QVBoxLayout; mainLayout-addWidget(quit); mainLayout-addLayout(cLayout); setLayout(mainLayout);二、二、 Qt/X11初步初步2.3 温度转换小程序温度转换小程序p 摄氏温度的显示摄氏温度的显示QSlider部件与窗

30、体布局部件与窗体布局 关联信号与槽:关联信号与槽:connect(quit, SIGNAL(clicked(), qApp, SLOT(quit();connect(slider, SIGNAL(valueChanged(int), label, SLOT(setNum(int);二、二、 Qt/X11初步初步2.3 温度转换小程序温度转换小程序p 华氏温度的显示QDial、QLCDNumber部件与QGridLayout 分解分解createScreen()class ConversionScreen : public QWidgetprivate: void createScreen();

31、 void createCel(); void createFah(); QSlider* slider; QDial* dial; QHBoxLayout* celLayout; QVBoxLayout* fahLayout;二、二、 Qt/X11初步初步2.3 温度转换小程序温度转换小程序p 华氏温度的显示QDial、QLCDNumber部件与QGridLayoutvoid ConversionScreen:createCel() slider = new QSlider(Qt:Vertical); slider-setRange(0, 100); slider-setValue(0);

32、slider-setTickPosition(QSlider:TicksLeft); QLabel* celLabel = new QLabel(0); celLayout = new QHBoxLayout; celLayout-addWidget(celLabel, 0, Qt:AlignRight); celLayout-addWidget(slider, 0, Qt:AlignLeft); celLayout-setSpacing(10); connect(slider, SIGNAL(valueChanged(int), celLabel, SLOT(setNum(int);二、二、

33、 Qt/X11初步初步p 华氏温度的显示QDial、QLCDNumber部件与QGridLayoutvoid ConversionScreen:createFah() QLCDNumber* lcdNum = new QLCDNumber(3); lcdNum-setSegmentStyle(QLCDNumber:Filled); dial = new QDial; dial-setRange(32, 212); dial-setValue(32); dial-setNotchesVisible(true); fahLayout = new QVBoxLayout; fahLayout-add

34、Widget(lcdNum, 0, Qt:AlignBottom | Qt:AlignHCenter); fahLayout-addWidget(dial); fahLayout-setSpacing(10); connect(dial, SIGNAL(valueChanged(int), lcdNum, SLOT(display(int);二、二、 Qt/X11初步初步p 华氏温度的显示QDial、QLCDNumber部件与QGridLayoutvoid ConversionScreen:createScreen() QPushButton* quit = new QPushButton(Q

35、uit); createCel(); createFah(); QGridLayout *mainLayout = new QGridLayout; mainLayout-addWidget(quit, 0, 0); mainLayout-addLayout(celLayout, 1, 0); mainLayout-addLayout(fahLayout, 1, 1); mainLayout-setSpacing(40); /网格内间矩网格内间矩 mainLayout-setMargin(40);/网格外边界大小网格外边界大小 setLayout(mainLayout); slider-set

36、Focus(); connect(quit, SIGNAL(clicked(), qApp, SLOT(quit(); setWindowTitle(Temperature Conversion);二、二、 Qt/X11初步初步p 华氏温度与摄氏温度的转换华氏温度与摄氏温度的转换 使两个温度计之间的计数互相随着对方的变化而变化,需要用使两个温度计之间的计数互相随着对方的变化而变化,需要用到信号和槽的连接,而且由于两个温度计的计数之间需要换算,不到信号和槽的连接,而且由于两个温度计的计数之间需要换算,不能只依赖于能只依赖于Qt提供的槽,而需要自己定义槽来完成换算。提供的槽,而需要自己定义槽来完成

37、换算。class ConversionScreen : public QWidget Q_OBJECT/当类中自定义信号或槽时,必须调用此宏当类中自定义信号或槽时,必须调用此宏 /才能完成信号和槽的连接。才能完成信号和槽的连接。public:private slots:/声明槽声明槽特殊的成员函数特殊的成员函数 void celToFah(int celNum); void fahToCel(int fahNum); private: void createScreen();二、二、 Qt/X11初步初步p 华氏温度与摄氏温度的转换华氏温度与摄氏温度的转换自定义槽的实现:自定义槽的实现:voi

38、d ConversionScreen:celToFah(int celNum) int fahNum = (celNum * 9 / 5) + 32; dial-setValue(fahNum);void ConversionScreen:fahToCel(int fahNum) int celNum = (fahNum - 32) * 5 / 9; slider-setValue(celNum);二、二、 Qt/X11初步初步p 华氏温度与摄氏温度的转换华氏温度与摄氏温度的转换建立信号和槽之间的连接:建立信号和槽之间的连接:void ConversionScreen:createCel()

39、connect(slider, SIGNAL(valueChanged(int), celLabel, SLOT(setNum(int); connect(slider, SIGNAL(valueChanged(int), this, SLOT(celToFah(int);void ConversionScreen:createFah() connect(dial, SIGNAL(valueChanged(int), lcdNum, SLOT(display(int); connect(dial, SIGNAL(valueChanged(int), this, SLOT(fahToCel(in

40、t);二、二、 Qt/X11初步初步p 华氏温度与摄氏温度的转换华氏温度与摄氏温度的转换重新编译源程序重新编译源程序 由于增加了两个自定义的槽,并且使用了宏由于增加了两个自定义的槽,并且使用了宏Q_OBJECT,如果,如果直接编译很可能得到连接错误的提示。此时必须借助直接编译很可能得到连接错误的提示。此时必须借助Qt的的moc(Meta Ojbect Compiler)工具来生成一个额外的源文件,加入这个源文件工具来生成一个额外的源文件,加入这个源文件到编译和连接的过程中,才能正确地得到最后的二进制执行程序。到编译和连接的过程中,才能正确地得到最后的二进制执行程序。 使用使用qmake重新生成

41、重新生成Makefile就可以利用就可以利用moc工具了。工具了。#qmake#make系统成功完成编译,并且在源程序目录下由系统成功完成编译,并且在源程序目录下由moc工具自动生成了一工具自动生成了一个名为个名为moc_ConversionScreen.cpp的源文件。的源文件。三、三、 Qt核心技术核心技术3.0 使用使用designer创建用户界面创建用户界面1、如果已经正确设置、如果已经正确设置PATH ,输入,输入designer,打开界面:,打开界面:三、三、 Qt核心技术核心技术3.0 使用使用designer创建用户界面创建用户界面2、选择一个窗口布局、选择一个窗口布局Widg

42、et 点击点击-创建创建三、三、 Qt核心技术核心技术3.0 使用使用designer创建用户界面创建用户界面3、从控制栏将需要的控件拖入窗口设计区,并设置适当的大小、从控制栏将需要的控件拖入窗口设计区,并设置适当的大小和位置,设置控件的相关属性,和位置,设置控件的相关属性,注意各控件的名称。注意各控件的名称。4、建立信号与槽的连接。、建立信号与槽的连接。 QSlider与与QLabel QDial与与QLCDNumber QPushButton与与Form5、保存为、保存为.ui文件(本例中为文件(本例中为mainForm.ui),退出),退出designer6、编写、编写main函数。函数

43、。三、三、 Qt核心技术核心技术3.0 使用使用designer创建用户界面创建用户界面main函数函数#include #include ui_mainForm.hint main(int argc,char* argv)QApplication app(argc,argv);QWidget* myQWidget=new QWidget;Ui:mainForm form;form.setupUi(myQWidget);myQWidget-show();return app.exec();:三、三、 Qt核心技术核心技术3.0 使用使用designer创建用户界面创建用户界面7 7、编译程序生

44、成工程文件、编译程序生成工程文件.:#qmake project#qmake project8 8、编译生成编译生成Makefile文件:文件:#qmake9、编译生成可执行文件:、编译生成可执行文件:#make10、运行、测试。、运行、测试。 11、创建自己的信号与槽、创建自己的信号与槽三、三、 Qt核心技术核心技术3.0 使用使用designer创建用户界面创建用户界面重点:程序实现的机制重点:程序实现的机制1.使用使用designer创建创建.ui文件,并编写文件,并编写main函数。函数。2.qmake project 创建创建.pro文件,默认文件名的目录名。文件,默认

45、文件名的目录名。3.qmake创建创建Makefile文件。此时目录下包含以下文件。此时目录下包含以下4个文件:个文件:main.cpp, , Makefile, xxxx.ui4.make命令运行后,除了相应的命令运行后,除了相应的.o文件和最终的可执行文件,文件和最终的可执行文件,还创建了哪些文件呢?还创建了哪些文件呢?5.答案是:答案是:ui_xxxx.h文件文件三、三、 Qt核心技术核心技术3.0 使用使用designer创建用户界面创建用户界面ui_mainForm.h代码片断代码片断不要试图修改该不要试图修改该文件,下次文件,下次make时该文件会再次时该文件会再次

46、自动生成。自动生成。class Ui_Formpublic: QPushButton *pushButton; QSlider *verticalSlider; void setupUi(QWidget *Form) if (Form-objectName().isEmpty() Form-setObjectName(QString:fromUtf8(Form); Form-resize(400, 300); pushButton = new QPushButton(Form); ;namespace Ui class Form: public Ui_Form ; / namespace Ui

47、三、三、 Qt核心技术核心技术3.0 使用使用designer创建用户界面创建用户界面ui_mainForm.h代码片断代码片断不要试图不要试图修改该文修改该文件,下次件,下次make时该时该文件会再文件会再次自动生次自动生成。成。class Ui_Formpublic: QPushButton *pushButton; QSlider *verticalSlider; void setupUi(QWidget *Form) if (Form-objectName().isEmpty() Form-setObjectName(QString:fromUtf8(Form); Form-resiz

48、e(400, 300); pushButton = new QPushButton(Form); connect(verticalSlider, SIGNAL(valueChanged(int), label, SLOT(setNum(int);三、三、 Qt核心技术核心技术3.0 使用使用designer创建用户界面创建用户界面重点:程序实现的机制重点:程序实现的机制#include #include ui_mainForm.hint main(int argc,char* argv)QApplication app(argc,argv);QWidget* myQWidget=new QWi

49、dget;Ui:Form form;form.setupUi(myQWidget);myQWidget-show();return app.exec();三、三、 Qt核心技术核心技术3.1 继续温度转换程序:继续温度转换程序:ui_xxxx.h中不能添加自己的代码,所以我们需要创建自己中不能添加自己的代码,所以我们需要创建自己的类,该类以的类,该类以QWidget或其子类为基类,或其子类为基类,包含包含ui_xxxx.h头头文件,继承其控件类,定义构造函数,文件,继承其控件类,定义构造函数,并添加自定义函数并添加自定义函数槽。槽。三、三、 Qt核心技术核心技术3.1 继续温度转换程序:继续温

50、度转换程序:自定义类的头文件(自定义类的头文件(.h文件)文件)#include #include ui_mainForm.hclass MyWidget:public QWidgetQ_OBJECT /当类中自定义信号或槽时,必须调用此宏当类中自定义信号或槽时,必须调用此宏 /才能完成信号和槽的连接。才能完成信号和槽的连接。public:MyWidget();private slots: /声明槽声明槽特殊的成员函数特殊的成员函数void celToFah(int celNum);void fahToCel(int fahNum);private:Ui:mainForm ui;三、三、 Qt

51、核心技术核心技术3.1 继续温度转换程序:继续温度转换程序:自定义类的实现(自定义类的实现(.cpp文件)文件)#include “MyWidget.hvoid MyWidget:celToFah(int celNum)ui.dial-setValue(celNum*9/5+32);void MyWidget:fahToCel(int fahNum) ui.verticalSlider-setValue(fahNum-32)*5/9);MyWidget:MyWidget():QWidget()ui.setupUi(this);connect(ui.verticalSlider,SIGNAL(v

52、alueChanged(int),this,SLOT(celToFah(int);connect(ui.dial,SIGNAL(valueChanged(int),this,SLOT(fahToCel(int);三、三、 Qt核心技术核心技术3.1 继续温度转换程序:继续温度转换程序:修改修改main.cpp文件文件重新编译、运行。重新编译、运行。再查看一下工程目录下多了哪些文件?再查看一下工程目录下多了哪些文件?#include #include “MyWidget.hint main(int argc,char* argv)QApplication app(argc,argv);MyWid

53、get* form=new MyWidget;form-show();return app.exec();三、三、 Qt核心技术核心技术3.1 继续温度转换程序:继续温度转换程序:温度转换程序中的类间关系(类图):温度转换程序中的类间关系(类图):Ui:mainForm三、三、 Qt核心技术核心技术3.1 继续温度转换程序:继续温度转换程序:温度转换程序中部件间关系:温度转换程序中部件间关系:三、三、 Qt核心技术核心技术3.2 在在qvfb下运行下运行Qt/Embedded程序程序1.qvfbQt virtual frame buffer三、三、 Qt核心技术核心技术3.2 在在qvfb下运

54、行下运行Qt/Embedded程序程序1. qvfbQt virtual frame buffer 由于由于Qtopia Core程序直接读写帧缓存程序直接读写帧缓存Frame Buffer,而开发工作一,而开发工作一般在桌面系统中进行,般在桌面系统中进行,Qt提供了虚拟的帧缓存,即提供了虚拟的帧缓存,即qvfb工具来方便开发工具来方便开发和调试工作。和调试工作。p正常情况下编译正常情况下编译qvfb:#cd /home/sprife/qt4/for_pc/qt-x11-opensource-src-4.4.0/tools/qvfb#make但实际上编译时会报错,找不到文件但实际上编译时会报错

55、,找不到文件“deviceskin.h”等错误!等错误! 三、三、 Qt核心技术核心技术3.2 在在qvfb下运行下运行Qt/Embedded程序程序1. qvfbQt virtual frame bufferp 成功编译成功编译qvfb:1)在)在qt源码目录中,将源码目录中,将$QTDIR/tools/shared/deviceskin目录下的目录下的deviceskin.cpp和和deviceskin.h文件复制到文件复制到$QTDIR/tools/qvfb目录下。目录下。2)在)在/ $QTDIR/tools/qvfb目录下执行如下指令,生成工程;目录下执行如下指令,生成工程; # $

56、QTDIR/bin/qmake -project3)修改)修改$QTDIR/tools/qvfb目录下的目录下的Makefile文件,在文件,在LIBS选项中加入选项中加入-lXtst;4)在)在$QTDIR/tools/qvfb目录下执行目录下执行make,结束后,就会生成生成可执行文件结束后,就会生成生成可执行文件qvfb。5)为使用方便,将)为使用方便,将qvfb复制到复制到/usr/local/Trolltech/Qt-x11-4.4.0/bin下,目前下,目前该目录为该目录为PATH的第一项。的第一项。三、三、 Qt核心技术核心技术3.2 在在qvfb下运行下运行Qt/Embedde

57、d程序程序2、编译、编译Qt/Embedded(基于基于x86平台平台):1)在)在/home/sprife/qt4下新建目录下新建目录for_x86 #mkdir for_x86 #cd for_x862)复制)复制Qt/E的源文件到的源文件到for_x86目录下并解压;目录下并解压; # cp /mnt/hgfs/shareCode/qt-embedded-linux-opensource-src-4.4.0.tar.bz2 ./ #tar -jxvf qt-embedded-linux-opensource-src-4.4.0.tar.bz23)#cd qt-embedded-linux

58、-opensource-src-4.4.0/三、三、 Qt核心技术核心技术3.2 在在qvfb下运行下运行Qt/Embedded程序程序2、编译、编译Qt/Embedded(基于基于x86平台平台):4)配置配置Qt/E,生成,生成Makefile #./configure -embedded x86 -little-endian -depths 4,8,16,24 -qt-gfx-qvfb -qt-kbd-qvfb -qt-mouse-qvfb -xplatform qws/linux-x86-g+5)编译:)编译:#gmake6)安装:)安装:gmake install成功后成功后Qt/E

59、将会安装到将会安装到/usr/local/Trolltech/QtEmbedded-4.4.0-i386下下三、三、 Qt核心技术核心技术3.2 在在qvfb下运行下运行Qt/Embedded程序程序3、重新编译用户程序、重新编译用户程序1)配置环境变量)配置环境变量 #vi set4qte 输入以下内容输入以下内容export QTDIR=/usr/local/Trolltech/QtEmbedded-4.4.0-i386export PATH=$QTDIR/bin:$PATHexport LD_LIBRARY=$QTDIR/libexport QMAKESPEC=$QTDIR/mkspec

60、s/qws/linux-x86-g+保存后运行保存后运行“source ./set4qte”2) 编译用户程序编译用户程序qmake projectqmakemake三、三、 Qt核心技术核心技术3.2 在在qvfb下运行下运行Qt/Embedded程序程序4、在、在qvfb下运行新生成的可执行文件下运行新生成的可执行文件1)启动)启动qvfb#qvfb -width 640 -height 480 -depth 16 & 2)运行用户程序)运行用户程序 #./CtoF2 -qws三、三、 Qt核心技术核心技术3.3 信号和槽信号和槽 在图形用户界面(在图形用户界面(GUI)编程,我们经常希望一个可视

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论