ImageVerifierCode 换一换
格式:DOC , 页数:25 ,大小:566KB ,
资源ID:6985367      下载积分:10 金币
验证码下载
登录下载
邮箱/手机:
图形码:
验证码: 获取验证码
温馨提示:
支付成功后,系统会自动生成账号(用户名为邮箱或者手机号,密码是验证码),方便下次登录下载和查询订单;
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/6985367.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请。


权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4009-655-100;投诉/维权电话:18658249818。

注意事项

本文(QT实验指导.doc)为本站上传会员【xrp****65】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

QT实验指导.doc

1、一、Qt概述 1、关于Qt Qt是Trolltech公司的一个产品。Qt是一个多平台的C++图形用户界面应用程序框架。它提供给应用程序开发者建立图形用户界面应用程序所需的所有功能。Qt是完全面向对象的,它很容易扩展,并且允许真正的组件编程。自从1996年早些时候,Qt进入商业领域,它已经成为全世界范围内数千种成功的应用程序的基础。Qt也是流行的Linux桌面环境KDE 的基础。(KDE是所有主要的Linux发行版的一个标准组件) Qt支持下述平台: MS/Windows - 95、98、NT 4.0、ME、和2000 Unix/X11 - Linux、Sun Solaris、HP

2、UX、Compaq Tru64 UNIX、IBM AIX、SGI IRIX和其它很多X11平台 Macintosh - Mac OS X Embedded - 有帧缓冲(frame buffer)支持的Linux平台。 2、Qt版本信息 Qt被按不同的版本发行: Qt企业版和Qt专业版:提供给商业软件开发。它们提供传统商业软件发行版并且提供免费升级和技术支持服务。企业版比专业版多一些扩展模块。 Qt自由版:是Qt仅仅为了开发自由和开放源码软件 提供的Unix/X11版本。在Q公共许可证和GNU通用公共许可证下,它是免费的。 Qt/嵌入式自由版:是Qt为了开发自由软件提供

3、的嵌入式版本。在GNU通用公共许可证下,它是免费的。 下表是关于Qt在Windows环境下各个版本的区别。(Qt为Windows只提供了专业版和企业版,不过自由版本的Qt仍然可以在Windows环境下使用) 组成模块 自由版 专业版 企业版 Qt的基本模块(工具、核心、窗口部件、对话框) 与平台无关的Qt图形用户界面工具包和应用类 X X X Qt设计器 可视化的Qt图形用户界面的生成器 X X X 图标视图模块 几套图形用户交互操作的可视化效果。 X X 工作区模块 多文档界面(MDI)支持 X X OpenGL 三维图形模块 在Qt

4、中集成了OpenGL X 网络模块 一些套接字,TCP,FTP和异步DNS查询并与平台无关的类 X 画布模块 为可视化效果,图表和其它而优化的二维图形领域 X 表格模块 灵活的,可编辑的表格/电子表格 X XML模块 通过SAX接口和DOM Level 1的XML解析器 X SQL模块 SQL数据库访问类 X 3、Qt的组成 Qt提供了一组范围相当广泛的C++类库,并包含了几种命令行和图形界面的工具,有效地使用这些工具可以加速开发过程。 Qt Designer:Qt设计器。用来可视化地设计应用程序界面。

5、 Qt Linguist:Qt语言学家。用来翻译应用程序。以此提供对多种语言的支持。 Qmake:使用此工具可以由简单的、与平台无关的工程文件来生成编译所需的Makefile。 Qt Assistant:关于Qt的帮助文件。类似于MSDN。可以快速地发现你所需要的帮助。 moc:元对象编译器。 uic:用户界面编译器。在程序编译时被自动调用,通过ui_*.h文件生成应用程序界面。 qembed:转换数据,比如,将图片转换为C++代码。 4、Qt的安装 安装的过程对于不同的Qt平台是不同的。在Windows环境下安装Qt,需要先安装MinGW。 MinGW,即 M

6、inimalist GNU For Windows。它是一些头文件和端口库的集合,该集合允许人们在没有第三方动态链接库的情况下使用 GCC(GNU Compiler C)产生 Windows32 程序。 在基本层,MinGW 是一组包含文件和端口库,其功能是允许控制台模式的程序使用微软的标准C运行时间库(MSVCRT.DLL),该库在所有的 NT OS 上有效,在所有的 Windows 95 发行版以上的 Windows OS 有效,使用基本运行时间,你可以使用 GCC 写控制台模式的符合美国标准化组织(ANSI)程序,可以使用微软提供的 C 运行时间扩展。该功能是 Windows32 API

7、 不具备的。下一个组成部分是 w32api 包,它是一组可以使用 Windows32 API 的包含文件和端口库。与基本运行时间相结合,就可以有充分的权利既使用 CRT(C Runtime)又使用 Windows32 API 功能。实际上 MinGW 并不是一个 C/C++ 编译器,而是一套 GNU 工具集合。除开 GCC (GNU 编译器集合) 以外,MinGW 还包含有一些其他的 GNU 程序开发工具 (比如 gawk bison 等等)。 在安装MinGW之后,再安装Qt,然后更改一下Windows系统的环境变量,就可以在Windows环境下使用Qt了。如果想在VC环境下使用Qt,那

8、么还需要进一步编译和设置,或者下载专门用于VC的QT版本。有关此方面的信息请参考附录。 二、 开始学习Qt 1、Hello, Qt! 我们以一个非常简单的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

9、Qt!"); 7 label->show (); 8 return app. exec (); 9 } 第1行和第2行包含了两个类的定义:QApplication和QLabel。对于每一个Qt的类,都会有一个同名的头文件,头文件里包含了这个类的定义。因此,你如果在程序中使用了一个类的对象,那么在程序中就必须包括这个头文件。 第3行是程序的入口。几乎在使用Qt的所有情况下,main()函数只需要在把控制权转交给Qt库之前执行一些初始化,然后Qt库通过事件来向程序告知用户的行为。argc是命令行变量的数量,argv是命令行变量的数组。这是一个C/C++特征。它不是Qt

10、专有的,无论如何Qt需要处理这些变量 第5行定义了一个QApplication对象App。QApplication管理了各种各样的应用程序的广泛资源,比如默认的字体和光标。App的创建需要argc和argv是因为Qt支持一些自己的命令行参数。在每一个使用Qt的应用程序中都必须使用一个QApplication对象,并且在任何Qt的窗口系统部件被使用之前创建此对象是必须的。App在这里被创建并且处理后面的命令行变量(比如在X窗口下的-display)。请注意,所有被Qt识别的命令行参数都会从argv中被移除(并且argc也因此而减少)。 第6行创建了一个QLabel窗口部件(widget),用

11、来显示“Hello,Qt!”。在Qt和Unix的术语中,一个窗口部件就是用户界面中一个可见的元素,它相当于Windows术语中的“容器”加上“控制器”。按钮(Button)、菜单(menu)、滚动条(scroll bars)和框架(frame)都是窗口部件的例子。窗口部件可以包含其它的窗口部件。例如,一个应用程序界面通常就是一个包含了QMenuBar,一些QToolBar,一个QStatusBar和其它的一些部件的窗口。绝大多数应用程序使用一个QMainWindow或者一个QDialog作为程序界面,但是Qt允许任何窗口部件成为窗口。在这个例子中,QLabel窗口部件就是作为应用程序主窗口的。

12、 第7行使我们创建的QLabel可见。当窗口部件被创建的时候,它总是隐藏的,必须调用show()来使它可见。通过这个特点我们可以在显示这些窗口部件之前定制它们,这样就不会出现闪烁的情况。 第8行就是main()将控制权交给Qt。在这里,程序进入了事件循环。事件循环是一种stand-by的模式,程序会等待用户的动作(比如按下鼠标或者是键盘)。用户的动作将会产生程序可以做出反应的事件(也被称为“消息”)。程序对这些事件的反应通常是执行一个或几个函数。 为了简单起见,我们没有在main()函数的结尾处调用delete来删除QLabel对象。这种内存泄露是无害的,因为像这样的小程序,在结束时操作

13、系统将会释放程序占用的内存堆。 下面我们来编译这个程序。建立一个名为hello的目录,在目录下建立一个名为hello.cpp的c++源文件,将上面的代码写入文件中。 运行“开始à程序àQt by TrolltechàQt Command Prompt”。 在命令行模式下,切换目录到hello下,然后输入命令:qmake –project。这个命令将产生一个依赖于工作平台的工程文件(hello.pro)。 再输入命令:qmake hello.pro。这个命令通过工程文件产生一个可以在特定工作平台上使用的makefile。 最后输入命令:make来产生应用程序。运行这个程序,可以得

14、到如下的程序界面。 Qt也支持XML。我们可以把程序的第6行替换成下面的语句: QLabel *label = new QLabel ("

Hello " "Qt!

"); 重新编译程序,我们发现界面拥有了简单的HTML风格。如下图: 2、调用退出 第二个例子展示了如何使应用程序对用户的动作进行响应。这个应用程序包括了一个按钮,用户可以点击这个按钮来退出程序。程序代码与上一个程序非常相似

15、不同之处在于我们使用了一个QPushButton来代替QLabel作为我们的主窗口,并且我们将一个用户动作(点击一个按钮)和一些程序代码连接起来。 1 #include 2 #include 3 int main (int argc, char *argv []) 4 { 5 QApplication app (argc, argv); 6 QPushButton *button = new QPushButton ("Quit"); 7

16、 QObject::connect (button, SIGNAL (clicked ()), 8 &app, SLOT (quit ())); 9 button->show (); 10 return app. exec (); 11 } Qt程序的窗口部件发射信号(signals)来指出一个用户的动作或者是状态的变化。在这个例子中,当用户点击这个按钮的时候,QPushButton就会发射一个信号——clicked()。一个信号可以和一个函数(在这种情况下我们把这个函数叫做“槽(slot)”)相连,当信号被发射的时

17、候,和信号相连的槽就会自动执行。在这个例子中,我们把按钮的信号“clicked()”和一个QApplication对象的槽“quit()”相连。当按钮被按下的时候,这个程序就退出了。 3、窗口布局 在本小节,我们将用一个样例来展现如何在窗口中规划各个部件的布局,并学习使用信号和槽来使两个窗口部件同步。这个应用程序要求输入用户的年龄,使用者可以通过一个旋转窗口或者一个滑块窗口来输入。 这个应用程序包括三个窗口部件:一个QSpinBox,一个QSlider和一个QWidget。窗口部件QWidget是程序的主窗口。QSpinBox和QSl

18、ider被放置在QWidget中;他们是QWidget的子窗口。当然,我们也可以说QWidget是QSpinBox和QSlider的父窗口。QWidget本身没有父窗口,因为它被当作一个顶级的窗口。QWidget以及所有它的子类的构造函数都拥有一个参数:QWidget *,这说明了它的父窗口。 下面是程序的代码: 1 #include 2 #include 3 #include 4 #include 5 int main (int argc, char *argv [])

19、 6 { 7 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, 13

20、0); 14 QObject::connect (spinBox, SIGNAL (valueChanged (int)), 15 slider, SLOT (setValue (int))); 16 QObject::connect (slider, SIGNAL (valueChanged (int)), 17 spinBox, SLOT (setValue (int))); 18 spinBox->setValue (50); 19 QHBoxLayout *l

21、ayout = new QHBoxLayout; 20 layout->addWidget (spinBox); 21 layout->addWidget (slider); 22 window->setLayout (layout); 23 window->show (); 24 return app. exec (); 25 } 第8行和第9行设置了QWidget,它将被作为程序的主窗口。我们调用函数setWindowTitle()来设置窗口的标题栏。 第10行和第11行创建了一个QSpinBox和一个QSlider,第12行和第

22、13行设置了它们的取值范围(我们假设用户最大也只有130岁)。我们可以将之前创建的QWidget对象window传递给QSpinBox和QSlider的构造函数,用来说明这两个对象的父窗口,但是这么做并不是必须的。原因是窗口布局系统将会自己指出这一点,自动将window设置为父窗口。我们一会儿就可以看到这个特性。 在第14行和第17行,两个对于QObject::connect()函数的调用确保了旋转窗口和滑块窗口的同步,这样这两个窗口总是显示同样的数值。不管一个窗口对象的数值何时发生变化,它的信号valueChanged(int)就将被发射,而另一个窗口对象的槽setValue(int)会

23、接受到这个信号,使得自身的数值与其相等。 第18行将旋转窗口的数值设置为50。当这个事件发生的时候,QSpinBox发射信号valueChanged(int),这个信号包括一个值为50的整型参数。这个参数被QSlider的槽setValue(int)接受,就会将滑块的值也设置为50。由于QSlider的值被改变,所以QSlider也会发出一个valueChanged(int)信号并触发QSpinBox的setValue(int)槽。但是在这个时候,QSpinBox不会再发出任何信号,因为旋转窗口的值已经被设置为50了。这将有效地防止信号的无限循环。 从第19行到第22行,我们通过使用一

24、个layout管理器对旋转窗口和滑块窗口进行了布局设置。一个布局管理者就是一个根据窗口作用设置其大小和位置的对象。Qt有三个主要的布局管理类: QHBoxLayout:将窗口部件水平自左至右设置(有些情况下是自右向左)。 QVBoxLayout:将窗口部件垂直自上向下设置。 QGridLayout: 以网格形式设置窗口部件。 第22行我们调用QWidget::setLayout()函数在对象window上安装布局管理器。通过这个调用,QSpinBox和QSlider自动成为布局管理器所在窗口的子窗口。现在我们明白为什么在设置子窗口时不用显式地说明父窗口了。 可以看到,虽然没

25、有明显地给出任何窗口的大小和位置,但QSpinBox和QSlider是很完美地被水平依次放置的。这是因为QHBox-Layout根据各个窗口的作用自动的为其设置了合理的大小和位置。这个功能使我们从烦琐的界面调整中解放出来,更加专注于功能的实现。 Qt构建用户界面的方法很容易理解,并且有很高的灵活性。Qt程序员最常用的设计模式是:说明所需要的窗口部件,然后设置这些部件必须的特性。程序员把窗口部件添加到布局管理器中,布局管理器就将自动地设置这些部件的大小和位置。而用户界面的行为是通过连接各个部件(运用信号/槽机制)来实现的。 4、派生QDialog 我们现在开始尝试着在Qt里只用C+

26、语言而不是借助界面设计器来完成一个对话框:FIND。我们将这个对话框作为一个类来完成,这么做的好处是我们使这个对话框成为了一个独立的,拥有自己的信号和槽的,设备齐全的组件。 程序的源代码由两部分组成:finddialog.h和finddialog.cpp。我们从头文件开始。 1 #ifndef FINDDIALOG_H 2 #define FINDDIALOG_H 3 #include 4 class QCheckBox; 5 class QLabel; 6 class QLineEdit; 7 class Q

27、PushButton; 第1行,第2行(和第27行)的作用是防止头文件被重复包含。 第3行包含了QDialog的定义。QDialog从QWidget继承而来,是Qt的对话框基类。 第4行到第7行是对我们将要用来填充对话框的对象的类的预定义。一个预先的声明将会告诉C++编译器这个类的存在,而不用给出所有关于实现的细节。 然后我们定义FindDialog作为QDialog的一个子类: 8 class FindDialog: public QDialog 9 { 10 Q_OBJECT 11 public: 12 FindDialog (QWidget *p

28、arent = 0); 在类定义顶端出现了宏:Q_OBJECT。这对于所有定义了信号或槽的类都是必须的。 FindDialog的构造函数拥有Qt窗口类的典型特征。参数parent声明了父窗口。其默认值是一个空指针,表示这个对话框没有父窗口。 13 signals: 14 void findNext (const QString &str, Qt::CaseSensitivity cs); 15 void findPrevious (const QString &str, Qt::CaseSensitivity cs); 标记为 signals的这一段声明了两个

29、信号。当用户点击对话框的“Find”按钮的时候,信号将被发射。如果选项“Search backward”被选中,对话框将发射消息findPrevious();相反的,对话框将发射消息findNext()。 关键字“signals”实际上也是一个宏。C++预处理器将在编译器看到它之前就已经将它转换为了标准的C++。Qt::CaseSecsitivity是一个枚举类型。它可以代表值Qt::CaseSensitive和Qt::CaseInsensitive。 16 private slots: 17 void findClicked (); 18 void enableFi

30、ndButton (const QString &text); 19 private: 20 QLabel *label; 21 QLineEdit *lineEdit; 22 QCheckBox *caseCheckBox; 23 QCheckBox *backwardCheckBox; 24 QPushButton *findButton; 25 QPushButton *closeButton; 26 }; 27 #endif 在类的private字段中,我们声明了两个槽。为了实现这些槽,我们需要访问大多数对话框的子窗

31、口,所以我们在私有字段中保留了这些子窗口的指针。和signals一样,关键字slots也是一个构造后可以被C++编译器辩识的宏。 对于私有变量,我们使用了它们的类的预定义。这是被编译器所允许的,因为他们都是指针,而我们在头文件中并不需要访问他们,所以编译器并不需要完整的类定义。我们可以在头文件中包含使用这些类所需要的头文件(,,等等),但是使用预定义可以在某种程度上加快编译过程。 现在我们来看源文件finddialog.cpp。源文件里包括了FindDialog类的实现。 1 #include 2 #include "fin

32、ddialog.h" 首先,我们包含了。这个头文件包含了对于Qt的GUI类的定义。Qt包括一些模块,每一个模块都依赖于自己的库文件。最重要的几个模块分别是QtCore, QtGui, QtNetwork, QtOpenGL, QtSpl, QtSvg和QtXml。头文件包括了QtCore和QtGui模块中所有类的实现。包含此头文件使我们不用单独地列出每个类所需要的头文件。 在filedialog.h中,我们也可以简单地包含,而不是像我们之前做的那样包括,并且给QCheckBox,QLabel,QLineEdit,QPushBu

33、tton提供预定义。这样似乎简单一些,但是在头文件中包含另外一个大的头文件是一个很坏的方式,尤其是在比较大的应用当中。 3 FindDialog::FindDialog (QWidget *parent) 4 : QDialog (parent) 5 { 6 label = new QLabel (tr ("Find &what :")); 7 lineEdit = new QLineEdit; 8 label->setBuddy (lineEdit); 9 caseCheckBox = new QCheckBox (tr ("

34、Match &case")); 10 backwardCheckBox = new QCheckBox (tr ("Search &backward")); 11 findButton = new QPushButton (tr ("&Find")); 12 findButton->setDefault (true); 13 findButton->setEnabled (false); 14 closeButton = new QPushButton (tr ("Close")); 在第4行,我们将参数parent传递给基类的构造函数。然

35、后我们创建子窗口。对于所有的字符串我们都调用函数tr(),这些字符串被标记为可以翻译成别的语言。函数tr()在QObject和每个含有Q_OBJECT宏的子类中被定义。将没一个用户可见的字符串都用TR()包括起来是一个很好的习惯,即使你现在并没有将程序翻译为别的语言的计划。对于Qt应用程序的翻译将在后述章节中详细呈现。 在字符串中,我们用操作符’&’来指出快捷键。例如,第11行创建了一个”Find”按钮。在支持快捷键的平台上用户可以按下Alt+F来切换到这个按钮上。操作符’&’也可以用来控制程序焦点:在第6行我们创建了一个拥有快捷键(Alt+W)的标签,在第8行我们给这个标签设置一个伙伴(

36、buddy):lineEdit。一个buddy就是当标签的快捷键被按下的时候,接收程序焦点的窗口。所以,当用户按下Alt+W的时候,程序焦点转移到字符编辑框上。 在第12行,通过调用函数setDefault(true),我们将按钮Find设置为程序的默认按钮(所谓的默认按钮就是当用户按下回车键时被触发的按钮)。在第13行,我们将按钮Find设置为不可用。当一个窗口被设置为不可用的时候,它通常显示为灰色,并不会和用户产生任何交互。 15 connect (lineEdit, SIGNAL (textChanged (const QString &)), 16

37、 this, SLOT (enableFindButton (const QString &))); 17 connect (findButton, SIGNAL (clicked ()), 18 this, SLOT (findClicked ())); 19 connect (closeButton, SIGNAL (clicked ()), 20 this, SLOT (close ())); 当字符编辑框中的文字被改变的时候,私有的槽enableFindButton(const QString &)被调用。私

38、有槽findClicked()在用户点击Find按钮时被调用。当用户点击关闭的时候,对话框将关闭自身。槽close()是从QWidget继承而来的,它的默认行为是隐藏窗口对象(而不是删除它)。我们马上就能看到槽enableFindButton()和findClicked()的代码。 由于QObject是FindDialog的一个父类,所以我们可以在调用connect()函数时忽略前面的前缀QObject:: 。 21 QHBoxLayout *topLeftLayout = new QHBoxLayout; 22 topLeftLayout->addWidget (la

39、bel); 23 topLeftLayout->addWidget (lineEdit); 24 QVBoxLayout *leftLayout = new QVBoxLayout; 25 leftLayout->addLayout (topLeftLayout); 26 leftLayout->addWidget (caseCheckBox); 27 leftLayout->addWidget (backwardCheckBox); 28 QVBoxLayout *rightLayout = new QVBoxLayout; 29

40、 rightLayout->addWidget (findButton); 30 rightLayout->addWidget (closeButton); 31 rightLayout->addStretch (); 32 QHBoxLayout *mainLayout = new QHBoxLayout; 33 mainLayout->addLayout (leftLayout); 34 mainLayout->addLayout (rightLayout); 35 setLayout (mainLayout); 接下

41、来,我们使用布局管理器来对子窗口部件进行布局。布局管理器可以包括窗口,也可以包括其它的布局管理器。通过对QHBoxLayout,QVBoxLayout和QGridLayout这三个布局管理类的嵌套使用,就可以生成非常复杂的对话框了。 如上图所示,对于对话框Find,我们使用了两个QHBoxLayout和两个QVBoxLayout。最外层的布局是主要的布局,它在第35行被安装并负责响应对话框的全部区域。另外的三个布局是子布局。图的右下方有一个“弹簧”,这是个空白的区域。在按钮Find和Close的下方使用空白是为了保证这些按钮出现在它们所在的布局的上方。 一个比较微妙的地方是布局管理

42、类并不是窗口对象。它们从QLayout继承而来,而QLayout从QObject继承而来。在上图中,窗口以实线标记,而布局以虚线标记。在一个正在运行的程序当中,布局是不可见的。 当子布局被添加到父布局中的时候(代码的第25行,33行和34行),子布局自动子类化。当主布局被安装的时候(第35行),它成为了对话框的一个子类,所以在布局当中的所有窗口对象都成为了对话框的子类。本例中各个类的继承层次在下图中表明。 36 setWindowTitle (tr ("Find")); 37 setFixedHeight (sizeHint ().height ()); 38 }

43、 在代码的最后,我们将对话框标题栏的内容设置为“Find”,然后给窗口设置一个合适的高度。由于这个对话框中没有任何子窗口可能占据多余的垂直空间,函数QWidget::sizeHint()将会返回一个“理想”的大小。 考虑一下FindDialog的构造过程。由于我们使用了new来生成对话框的窗口和布局,看起来我们应该为每一个窗口和布局编写一个析构函数来调用delete。事实上这不是必须的,因为在父窗口被销毁的时候,Qt将会自动删除所有的子对象。本例中,所有的窗口和布局都是从FindDialog继承而来,在对话框被关闭的时候,这些子对象也会被自动销毁。 现在我们看一下对话框的槽: 3

44、9 void FindDialog::findClicked () 40 { 41 QString text = lineEdit->text (); 42 Qt::CaseSensitivity cs = 43 caseCheckBox->isChecked ()? Qt::CaseSensitive 44 : Qt::CaseInsensitive; 45 if (backwardCheckBox->isChecked ()) { 46

45、emit findPrevious (text, cs); 47 } else { 48 emit findNext (text, cs); 49 } 50 } 51 void FindDialog::enableFindButton (const QString &text) { 52 findButton->setEnabled (! text.isEmpty ()); 53 } 当用户按下Find按钮时,按钮会发射findPrevious()或者findNext()信号,槽findClicked()会被调用。关键字emit在Qt里

46、很特殊,和其它的Qt扩展名一样,它在被传递给标准C++编译器之前会被C++预处理器转换。 当用户改变字符编辑框中的内容时,槽enableFindButton()被调用。也就是说,当字符编辑框中有内容时,Find按钮是可见的;当编辑框中没有内容的时候,Find按钮不可见。 这两个槽被定义之后,我们关于这个对话框的内容就完成了。现在可以创建一个名为main.cpp的文件来试验一下FindDialog窗口。 1 #include 2 #include "finddialog.h" 3 int main (int argc, char *argv [])

47、4 { 5 QApplication app (argc, argv); 6 FindDialog *dialog = new FindDialog; 7 dialog->show (); 8 return app. exec (); 9 } 现在可以编译并运行这个程序了。如果你的平台支持快捷键,尝试着使用快捷键Alt+W,Alt+C,Alt+B和Alt+F来触发正确的行为。按下Tab键来切换各个窗口。默认的tab顺序在程序生成时已经确定。如果想更改这个顺序,可以调用函数QWidget::setTabOrder()。 以上我们派生了QDia

48、log来生成对话框。同样的道理,我们也通过可以派生QMainWindow来生成程序主窗口,然后在主窗口中创建菜单和工具条。也就是说,我们可以通过只编写代码来生成一个完整的程序。 5、关于“信号和槽”(signal and slot) 通过上几节我们已经看到了“信号与槽”的运用。下面我们详细解释这个机制以及一些相关的内容。使用信号与槽的基本格式为: connect (sender, SIGNAL (signal), receiver, SLOT (slot)); 这里的sender和receiver是指向QObject的指针,而signal和slot是无参数名的函数信号。 “信

49、号和槽”机制用于Qt对象间的通讯。“信号/槽”机制是一种关于无缝对象通讯的机制,它是Qt的一个中心特征,也是Qt与其它工具包的最不相同的部分。 在图形用户界面编程中,我们经常希望一个窗口部件的一个变化被通知给另一个窗口部件。更一般地,我们希望任何一类的对象可以和其它对象进行通讯。例如,如果我们正在解析一个XML文件,当我们遇到一个新的标签时,我们也许希望通知列表视图我们正在用来表达XML文件的结构。 较老的工具包使用一种被称作回调(callback)的通讯方式来实现同一目的。回调是指一个函数的指针,如果你希望一个处理函数通知你一些事件,你可以把另一个函数(回调)的指针传递给处理函数。处理函

50、数在适当的时候调用回调。回调有两个主要缺点:首先他们不是类型安全的。我们从来都不能确定处理函数使用了正确的参数来调用回调。其次回调和处理函数是非常强有力地联系在一起的,因为处理函数必须知道要调用哪个回调。 在Qt中我们有一种可以替代回调的技术。我们使用信号和槽。当一个特定事件发生的时候,一个信号被发射。Qt的窗口部件有很多预定义的信号,但是我们总是可以通过继承来加入我们自己的信号。‘槽’就是一个可以被调用处理特定信号的函数。Qt的窗口部件也有很多预定义的槽,但是通常的习惯是你可以加入自己的槽,这样你就可以处理你所感兴趣的信号。 “信号和槽”的机制是类型安全的:一个信号的签名必须与它的接收

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服