嵌入式应用系统开发-QT creator进阶1_第1页
嵌入式应用系统开发-QT creator进阶1_第2页
嵌入式应用系统开发-QT creator进阶1_第3页
嵌入式应用系统开发-QT creator进阶1_第4页
嵌入式应用系统开发-QT creator进阶1_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

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

文档简介

嵌入式应用系统开发----QtCreator进阶一主讲:一.QtCreator编写多窗口程序

实现功能:程序开始出现一个对话框,按下按钮后便能进入主窗口,如果直接关闭这个对话框,便不能进入主窗口,整个程序也将退出。当进入主窗口后,我们按下按钮,会弹出一个对话框,无论如何关闭这个对话框,都会回到主窗口。一.QtCreator编写多窗口程序

实现原理:程序里我们先建立一个主工程,作为主界面,然后再建立一个对话框类,将其加入工程中,然后在程序中调用自己新建的对话框类来实现多窗口。实现过程:1.首先新建“QtGui应用”工程,工程名为nGui,选中QT模拟器,基类(Baseclass)选为QWidget。2.新建对话框类,选择“文件—新建文件或工程”如下图,在新建中,选择“Qt设计师界面类”。3.选择DialogwithoutButtons。4.类名设为myDlg。5.点击Finish完成。注意这里已经默认将其加入到了我们刚建的工程中了。进入myDlg控件界面6.如下图,在mydlg.ui中拖入一个PushButton,将其上的文本改为“进入主窗口”,在其属性窗口中将其objectName改为enterBtn,在下面的Signalsandslotseditor中进行信号和槽的关联,首先点击“+”号,添加信号和槽。其中,“发送者”设为enterBtn,“信号”设为clicked(),“接受者”设为myDlg,“槽”设为accept()。这样就实现了单击这个按钮使这个对话框关闭并发出Accepted信号的功能。下面我们将利用这个信号。7.修改主函数main.cpp,如下:#include<QtGui/QApplication>#include"widget.h"#include"mydlg.h“//加入头文件

intmain(intargc,char*argv[]){QApplicationa(argc,argv);Widgetw;myDlgmy1;//建立自己新建的类的对象my1

if(my1.exec()==QDialog::Accepted)//利用Accepted信号判断enterBtn是否被按下

{

w.show();//如果被按下,显示主窗口returna.exec();//程序一直执行,直到主窗口关闭}elsereturn0;//如果没被按下,则不会进入主窗口,整个程序结束运行

}8.如下图,在主窗口加入按钮,显示文本为“弹出一个对话框”,在其上点击鼠标右键,在弹出的菜单中选择“转到槽(gotoslot)”。9.我们选择单击事件clicked()。10.我们在弹出的槽函数中添加一句:my2.show();my2为我们新建对话框类的另一个对象,但是my2我们还没有定义,所以在widget.h文件中添加相应代码,如下,先加入头文件,再加入my2的定义语句,这里我们将其放到private里,因为一般的函数都放在public里,而变量都放在private里。#ifndefWIDGET_H#defineWIDGET_H#include<QtGui/QWidget>#include"mydlg.h“//包含头文件namespaceUi{classWidget;}classWidget:publicQWidget{Q_OBJECTpublic:Widget(QWidget*parent=0);~Widget();private:Ui::Widget*ui;

myDlgmy2;//对my2进行定义

privateslots:voidon_pushButton_clicked();};#endif//WIDGET_H到这里,再运行程序,便能完成我们实验要求的功能了。整个程序里,我们用两种方法实现了信号和槽函数的关联,第一个按钮我们直接在设计器中实现其关联;第二个按钮我们自己写了槽函数语句,其实图形的设计与直接写代码效果是一样的。这个程序里我们实现了两类窗口打开的方式,一个是自身消失而后打开另一个窗口,一个是打开另一个窗口而自身不消失。可以看到他们实现的方法是不同的。二.信号与槽实例:按钮与显示。1.建立新项目,qt控件项目命名:btntxt,保存路径:/home/cwd/qt.下一步,取消勾选“影子构建”和“qt模拟器”连续“下一步”,完成。这是会出现一个工程项目:btntxt双击“界面文件:mainwindow.ui”进入“界面设计”。在界面设计器中,拖拽控件组“button”中的“pushbutton”,放置窗体中,放置两个。第一个button其控件上的文字改为show,第二个改为close。拖拽控件组“inputwindows”中的控件“textedit”到窗体中,布局如下:建立信号与槽连接此时第一个button其名字是“pushbutton”,第二个是“pushbutton_2”,这是缺省命名,你可以修改。文本编辑框叫“textedit”。鼠标右击第一个button,在右键菜单中选择“转到槽”,然后在弹出窗口中选择信号为“clicked()”。这时,主窗口mainwindow.cpp中出现一个新的代码段,函数名为“on_pushbuttonon_clicked()”,属于“mainwindow”类。见下图:可以在其中键入代码:ui->textedit->settext(“fromthepeople,bythepeople,forthepeople”)注意,尽量采用“补齐”的方式输入,可以用来检错,也可以帮助你熟悉命令。输入完毕可以尝试运行一次,点击左侧栏绿色的运行图标,每次运行都全面地进行了qmake和编译链接。在弹出的运行界面上,点击按钮“show”,在上方的文本框内会显示:fromthepeople,bythepeople,forthepeople但此时,按钮“close”还不起作用。需要进一步建立信号与槽的连接。回到界面设计窗口,选中“close”按钮,在下方“信号与槽编辑器”窗口,点击“+”号,生成一个信号与槽连接。发送者选“pushbutton_2”,信号选“clicked()”,接收者选主窗体“mainwindow”,槽函数选“close()”。这样就建立了一个信号与槽连接机制,“close”按钮被按下,即将引发主窗体的关闭,程序退出。以上用两种方法,建立了信号与槽的连接,这两种方法之间是有区别的。右键选择的方法,是新建一个槽函数,通常用于本窗体内部的事务。需要在槽函数中添加代码。使用信号与槽编辑器的方法建立连接,通常是针对某窗体的原有的槽函数,可以不需要添加代码。如果把它当做新建的槽函数,将会改写原有的槽函数,引起未知错误。第三种建立信号和槽连接的方法是用代码完成。上一个实例中已经演示了。从实例到理论解释代码:main.cpp#include<QtGui/QApplication>#include"mainwindow.h"intmain(intargc,char*argv[]){QApplicationa(argc,argv);MainWindoww;w.show();returna.exec();}#include<QtGui/QApplication>包含了文件qapplication.h,和qtgui.h,此文件总是被包含再同样的源文件中,它里面包含了main()函数。这是两个大类,窗体、控件、槽函数等等都被包容其中。#include“mainwindow.h“,这是主窗体的头文件,intmain(intargc,char*argv[])这是main函数,带有两个行命令参数,argc和argv[]。argc是命令行变量的数量,argv[]是一个命令行变量的数组函数。QApplicationa(argc,argv);创建了一个QApplication对象,缺省情况下命名为a。QApplication对象是一个容器,包含了应用程序顶层的窗口(或者一组窗口)。顶层窗口是独一无二的,它在应用程序中从来就没有父窗口。因为Application对象的任务是控制管理你的应用程序,因此在每个应用程序中只能有一个QApplication对象。此外,由于创建对象的过程必须初始化Qt系统,所以在使用其它任何Qt工具之前,QApplication对象必然已经存在了。一个Qt程序就是一个标准的C++程序。这就意味着为了启动程序,函数main()将被操作系统所调用。而且,像所有的C++程序一样,命令行选项可能会也可能不会传递给main()函数。命令行选项作为初始化过程的一部分传递给Qt系统,也是体现在QApplicationa(argc,argv)这条语句中。两个命令行参数:argc和argv,在a结构中使用,因为这样可以指定一些特殊的标志和设置。例如,用-geometry参数启动Qt程序,将可以指定窗口显示的位置和大小。通过修改启动程序的外观信息,用户可以自己按照喜好定义程序的外观风格。MainWindoww;产生一个窗体,名字叫“w”。这就是主窗体。w.show();让主窗体可见。returna.exec();语句调用了exec()函数和返回系统一个值。Main()将控制权交给了Qt。这里,程序进入了事件循环,事件循环是一种standby模式,程序会等待用户动作(比如按下鼠标或者键盘),用户的动作将会产生程序可以做出反应的事件(也称“消息”),#include"mainwindow.h"#include"ui_mainwindow.h"MainWindow::MainWindow(QWidget*parent):QMainWindow(parent),ui(newUi::MainWindow){ui->setupUi(this);}MainWindow::~MainWindow(){deleteui;}voidMainWindow::on_pushButton_clicked(){ui->textEdit->setText("fromthepeople,byzhepeople,forthepeople");}#include"ui_mainwindow.h"包含界面文件ui,界面ui不是窗体,是窗体的设计器。MainWindow::MainWindow(QWidget*parent):类“MainWindow”下的一个成员函数MainWindow()。ui(newUi::MainWindow)一个ui()函数,是一个界面文件。它创建了一个叫mainwindow的主窗体。ui->setupUi(this);这个ui()界面文件,做了一个动作:建立“这个”界面。“this”的意思当前的类。MainWindow::~MainWindow(){deleteui;}Mainwindow这个类有一个成员函数~mainwindow(),这个函数完成一个功能:删除ui界面文件。为的是在程序退出时释放内存。voidMainWindow::on_pushButton_clicked(){ui->textEdit->setText("fromthepeople,byzhepeople,forthepeople");}在类Mainwindow下有一个成员函数即槽函数,完成的功能是在文本框textedit中显示一段文字。这个槽函数当第一个按钮“pushbutton’被点击时被触发。ui->textEdit->setText(“‘”)这条语句意思是:在ui驱动textedit作一个设置文本内容的动作。信号与槽机制信号与插槽机制提供了对象间的通信机制,它易于理解和使用,并完全被Qt图形设计器所支持。图形用户接口的应用需要对用户的动作做出响应。例如,当用户点击了一个菜单项或是工具栏的按钮时,应用程序会执行某些代码。大部分情况下,我们希望不同类型的对象之间能够进行通信。程序员必须把事件和相关代码联系起来,这样才能对事件做出响应。以前的工具开发包使用的事件响应机制是易崩溃的,不够健壮的,同时也不是面向对象的。Trolltech创立了这种新的机制,叫做“信号与插槽”。信号与插槽是一种强有力的对象间通信机制,它完全可以取代原始的回调和消息映射机制;信号与插槽是迅速的,类型安全的,健壮的,完全面向对象并用C++来实现的一种机制。在以前,当我们使用回调函数机制来把某段响应代码和一个按钮的动作相关联时,我们通常把那段响应代码写成一个函数,然后把这个函数的地址指针传给按钮,当那个按钮被按下时,这个函数就会被执行。

对于这种方式,以前的开发包不能够确保回调函数被执行时所传递进来的函数参数就是正确的类型,因此容易造成进程崩溃,另外一个问题是,回调这种方式紧紧的绑定了图形用户接口的功能元素,因而很难把开发进行独立的分类。然后调用connect()函数把这个插槽和一个信号连接起来,这样就完成了一个事件和响应代码的连接。信号与插槽机制并不要求类之间互相知道细节,这样就可以相对容易的开发出代码可高重用的类。信号与插槽机制是类型安全的,它以警告的方式报告类型错误,而不会使系统产生崩溃。例如,如果一个退出按钮的clicked()信号被连接到了一个应用的退出函数-插槽quit()。那么一个用户点击退出键将使应用程序终止运行。上述的连接过程用代码写出来就是这样connect(button,SIGNAL(clicked()),qApp,SLOT(quit()))

我们可以在Qt应用程序的执行过程中增加或是减少信号与插槽的连接。信号与插槽的实现扩展了C++的语法,同时也完全利用了C++面向对象的特征。信号与插槽可

温馨提示

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

评论

0/150

提交评论