QT 基础学习教程最后修改日期34.docx
《QT 基础学习教程最后修改日期34.docx》由会员分享,可在线阅读,更多相关《QT 基础学习教程最后修改日期34.docx(18页珍藏版)》请在冰豆网上搜索。
![QT 基础学习教程最后修改日期34.docx](https://file1.bdocx.com/fileroot1/2022-12/31/28077844-492e-4314-8aac-1efaef63a3bf/28077844-492e-4314-8aac-1efaef63a3bf1.gif)
QT基础学习教程最后修改日期34
本教程主要是帮助初学者尽快的熟悉QTCreator基本操作,达到使用QTCreator开发桌面程序的目的.QTCreator主要是使用C++进行编程.所以最好有一些C++编程的基础.推荐看下孙鑫的VC视频.如果你没找到那么请联系我QQ:
761153454.本身QT的例子网上有很多,但是我这个文章的侧重点不在QT的应用上,而在QT的基础操作上.懂得了如果查到自己需要的东西,那你开发编程会事半功倍.授人以鱼,不如授人以渔(驴).送给初学者一句名言吧:
世上无难事,只怕有些人.只要你有恒心,你就是”有些人”.
工具安装:
QT5.0.1forwindows32-bit(481M),
VS2010旗舰版(2.45G)
调试器dbg_x86_6.11.1.402(XX搜索即可)
系统:
XP或Win7
附:
QTCreator的下载地址:
http:
//qt-project.org/downloads(QT5.0.1库集成了QTCreator)
红框中是我们要下载的软件.
第一章界面介绍
创建工程的步骤:
文件->新建文件或项目->QTGUI应用.一路坚定的点下去即可.下图是工程myself.在项目管理窗口可以看到它的名字.
上述的4个窗口进行介绍.窗口名字是我起的.但这不影响我们的教学.
1”项目管理窗口”作用:
在这里你可以随意切换不同项目及在同一个项目中切换文件代码页.而实现的手段是双点鼠标.从此窗口中我们看到了它包含头文件(.h),源文件(.cpp),及界面文件(.ui).双点你要编辑的文件,在代码编辑窗口就会显示出来.资源,是保存一些项目中用到的图片,图片等.
2.代码编辑窗口是编写代码的地方,也是我们主要工作的地区.它的主体是一系列的函数.如下图.1处为类MainWindow的析构函数,2为SPinbox的完成函数.3,4为按钮的单击函数.里边都包含相应的代码.右侧为按钮2的单击完整函数.
3.”帮助窗口”的使用在我们在代码编辑时候,遇到问题或者想查阅该类相关的操作时候,按下F1即可.就会在窗口的右侧显示出来相应类名的帮助文档.
4.”信息输出窗口”提示出错信息及编译信息等.当我们按下F5调试的时候,代码存在的错误就会在此显示出来.警告一般不影响调试的进行.如下图是警告信息.
如何进行可视化编程
我们刚才打开了一个已经创建好的项目myself.pro.注意保存的项目路径不能含有中文.接下来我们继续来学习,看如何进行可视化编程.
双点你的工程管理窗口中界面文件mainwindow.ui.双点后如图所示.
控件组窗口包含所有控件(控件就是一个叫法而已,例如按钮,文本框,标签等都被称为控件),使用方法是将指定的控件左键拖住不放拽到设计窗口即可.
设计窗口,是在按下F5时候显示出现的窗口.你可以在它上边放入各种控件,程序运行起来后就会形成一个含有按钮,标签等各种控件的窗口.
类对象管理窗口,是对窗口类和对象进行管理的地方.
控件属性窗口,用来显示相应控件的各种属性.例如文本框,它的属性包含字体大小,是否只读等,就在这里可以设置,当然你也可以编写代码来达到目的.
QT的代码编写.
在开始之前说下类,对象的关系.类,包含对象;对象,在类中.类和对象是面向对象的C++,Java的内容.对象是类的一个指定个体.类是众多个体的功能和性质总和.例如按钮控件属于按钮类,而按钮控件就是按钮类的一个对象.按钮控件是按钮类的具体的一个个体.按钮类就是许多对象(按钮控件)的属性的集合.如果你理解困难,你可以联系下.人类和我们自己的关系.我们自己都是人类,好比按钮控件属于按钮类;而你我又是人类中独有的特定的个体,这时在C++中就称你我为人类中的一个对象.好比按钮控件,是按钮类中的一个独有的特定的那个个体,这时我们的按钮控件就叫按钮类的一个对象.应该理解的差不多了吧.
我们接下来要结合一个例子介绍QT的代码编写.
设计窗口中拖入1个按钮控件和1个标签控件.如图.我们的目的是将按钮的显示文本改为”按钮”,点击按钮后标签显示为”QT学习”.很简单.
步骤:
1)拖入设计窗口中2个题目中要求的控件.这个不在话下.
2)改变按钮的显示文本.目前按钮的显示文本为pushbutton.我们可以使用2种方法达到目的.一是双点按钮控件,按钮的显示文本进入编辑状态
你可以输入”按钮”即可.第二种通过编写代码实现.我们来看看第二种方法如何实现.
3)在按钮上点击右键->转到槽,这时弹出对话框,里边都是按钮的一些槽.我们选择信号为click(),然后点击确定按钮.
”槽”你会陌生这时QT专有的.当我们点击确定后,会自动转到一个槽函数的编写处.下图的红框里.我们只需在大括号之间填入代码即可.
输入的代码如下图.QT使用了自动感知,所以当我们输入ui->的时候,会自动列出来ui下的所有可用资源.这里的ui->label->setText()中的ui又是什么呢?
我当初接触的时候也疑惑一阵子.现在不迷惑,是因为我不去研究它了(就是也没全懂呢).ui是一个指针,它指向了我们”设计窗口”中的所有控件及其他的东西.在这里指向了我们的标签控件.指向用:
”(减号)-(箭头)>”表示.由于QT内部进行了处理,你也可以使用”(英文的句号).”表示.就是说输入的时候ui.和ui->都可以.你试下就知道了.有朋友会问,label控件设置文本的函数你怎么知道是setText()呢?
这个我们下面来讲这里只是让大家熟悉QT的代码输入位置.
4)经过以上操作,我们实现了标签显示”QT学习者”,按钮的显示了”按钮”.按下F5,当我们点击按钮时显示结果如图
5)总结:
我们先理解下刚才的操作意义.右键点击按钮时候,在’槽’对话框中我们选择了信号click().这就意味着当我们单击按钮的时候将自动产生一个click(就是单击信号)的信号.而槽进行了接收,接收的处理部分就是我们的槽函数Mainwindow:
:
on_pushbutton_clicked().
在这里我们的槽函数执行了改变显示内容的操作.看似简单的最困难.那么经过上边的操作,我们完成了一个小例子.
帮助文档的使用
下面我们解决”label控件设置文本的函数你怎么知道是setText()”这个问题.这涉及到了帮助文档的使用,能看懂帮助文档,你就成功了一半.
代码编写过程中查找自己所需要的内容.
例如上个例子中我们曾用到”ui->label->setText("学习者\");”这句代码.只需将光标移到label处,按下F1.这时窗口的右侧即可显示label类帮助信息.如下图.
我讲下QlabelClass的帮助.对于熟悉英文的朋友,这是小菜了吧.
添加类名的格式:
#include<类名>
在使用某个类的时候要加入这个类的名字.
这在帮助文档里都已经提醒了.
1.Inherits(继承).这里是说该类来自于哪里.Qlabel来自于 QFrame.它的实际意义就是说,QFrame类的一些函数和属性,可以被Qlabel类使用.例如说.你继承了父亲的权位,那么你就有了一些父亲的权力(不是全部权力).好比Qlabel类可以继承一部分QFrame的属性和函数但不是全部都继承.具体继承了哪些呢?
点击红框处的listofallmembers.includeinheritedmembers.的链接.所有的成员列表,包含继承的成员(成员可以理解为属性和函数).在这个列表中都是我们可以自由使用的.
2.properies(特性).这是Qlabel独有的.不是继承的,才能称为独有的.意义是我们可以使用这里提到的所有参数.
3)publicfunctions(公有函数).C++中认为公有函数可以在外部函数使用.意义是你可以自由使用这里的每个函数或属性.基本上我们大多数使用的都是位于这里的函数.
4)publicslots(公有的槽).这里的setText()我也看得眼熟.就是我刚刚用过的settex()原来它是槽.我们在第一个例子中提到了槽是如何起作用的.槽通过信号触发,然后通过槽函数处理来发挥出槽的作用.settext(“QT学习者\”),就是将Qstring类型的“QT学习者\”中文字符串,送给了槽settext().至于它调用了哪个槽函数我们不必管它.知道settext()槽一定是调用了某个函数就行了.这个槽实现了什么功能呢,你点击它,就行了.文档会有详细介绍
5)信号.意义是在信号和槽编辑器中我们可以找到这里的2个信号.它是发出的信号供其他槽进行接收的.信号和槽编辑器位置在设计窗口的下方.或者你通过菜单编辑->编辑信号和槽F4也可找到.
6)重新实现的保护的函数.意义我还没发现暂且不论.
经过以上帮助文档的介绍,我想我们初步有了一个印象.如何使用帮助文档.里面的各个属性,函数,事件需要我们在工作中多多学习积累.这样才能进步.
总结:
这是QTCreator的基本使用操作.当然不是太完善.但是对于不完善,我会补全.大家共勉,留个QQ群吧.方便大家交流.QT兴趣小组群218967017
本人QQ761153454.
晓梦思年华
3/3/201316:
58:
30
第二章编写程序的方法
第一章,我只是简单的介绍了QTCreator的界面布局,如何添加槽函数,如何帮助文档的结构.如果你觉得从第一章没有学到什么东西的话.那么我想第二章会给你一个交代.我在学习的过程中的一些总结就在这里了.
开始之前,我们仍然以第一章的小程序为例讲解.我们要在它的上边进行扩展,这样子,你会从浅入深学到一些新东西.
上图是我们的stand例子.在”项目管理窗口”源文件下可以看到有2个C++文件,以扩展名.cpp结尾.那么这2个文件是做什么的呢?
我们双击main.cpp.可以看到它的代码,这里用右侧的红框框住了.代码中我们可以看到它有2部分组成.
一是#include头文件:
二是intmain(参数){代码}:
首先说#include头文件:
这是c或c++的一个语句.它的作用是,引入头文件,引入后我们可以使用头文件中的变量或者函数了.头文件就是一个以.h结尾的文件或者以.cpp结尾的文件.例如这里的#include“mainwindow.h”.当然我们曾在第一章的帮助文档中查阅过Qlabel类的帮助.其中有一条是#include.就是说当我们使用标签类的时候一定要引入这个头文件.所以我们这里的第二行代码#include,就是说明我们引用了应用程序类,并在引用后使用了应用程序类的某些功能(函数或者属性).如果你想了解下这个类做什么的,你可以光标移动到这个头文件上按下F1.帮助文档中有详细的说明.这2个头文件是每个程序都有的.当然你可以在此位置加入其他的头文件,但不可以删除这2个头文件.如下图是我在myself项目中引入了hexspinbox.h这个头文件,还引用了其他的控件类如按钮类,标签类,数码管字体类等.
其次是intmain(参数){代码}.这是主函数.它是整个项目执行的起始部分.我们如何知道的呢.当程序编写完按下F10进入单步运行的时候,可以看到如下图所示.行号5的左侧有个小箭头.它就是程序执行的所在位置.箭头在哪里,说明程序执行到了哪里.再次按下F10,箭头会顺序移动到行6,这也是程序调试的方法.
当我们执行到行7的时候,请你按下F11.你会发现程序的执行箭头转到了mainwindow.cpp中的行8.再次按2下F10,你会发现执行箭头重新返回了main.cpp中.顺序执行完行8,这时箭头落在行9,(注意箭头所在行是没有执行的代码行,是即将被执行的代码行.箭头以上的代码行是执行了的.所以执行完行8,箭头就落在行9)我们可以在任务栏发现有了一个小窗口图标,但这个小窗口显示是不正常的.当我们执行完行9,箭头所在了行10.这时我们的小窗口完整显示出来了.这是QT程序的执行步骤.总结下就是从main(参数)主函数的第一个左大括号开始,终结于它的右大括号前的语句.大括号之间的代码按从上到下的行顺序执行一次.当然这中间有跳转的地方也有在一条语句处循环执行的情况.我接下来说这里.
这是执行完行9的结果显示.
从现在开始我们就要接触C++独有的部分,如果没有接触过面向对象的朋友,可能会不好懂.很幸运,我也是从初学者过来的,我们应属于同一类人.这样我们的距离就不会太远.我会用自己的理解来讲述类,对象,继承,构造等.请你一定要明确,你在学习我们这篇教程材料的最初目的,不要偏离目标.
把这段代码贴出来.
行6,QApplicationa(argc,argv);这是应用程序类实例化了一个对象a.C++中有类和对象之分.对象属于类,类是对象的集合.也可以这样理解,QApplication是个类型,我们定义了一个变量a,a的类型是Qapplication.这样理解,就意味a具有了一些Qapplication类公有的函数和变量.C嘎嘎中的变量或函数分公有,私有,保护等3种.只有公有的变量和函数才能在类定义外的函数中被继承使用.继承也是C嘎嘎中的概念,意思就是拥有,可以使用.如这里a,在主函数里,而非在”类定义”内(类有自己的专有定义格式).所以a只能拥有Qapplication类的公有变量和函数.在这概念的东西,我叙述的并不准确,如果想知道确切的概念.可以找本C嘎嘎的教程看下.a是一个对象这不假,但它存在的意义是什么呢?
a为我们的这个项目运行提供了必要的支持,例如项目运行时窗口的形成?
如何会形成窗口?
窗口形成前,QT是如何与操作系统交流的?
这都依赖于a.这些功能都是我们看不到的无法干预的,但又存在的.详尽的介绍请看帮助文档.类实例化对象的语法是:
类名对象名;
行7MainWindoww;这行同行6一样.w是个对象,属于mainwindow类.这个w代表我们项目中的设计窗口.mainwindow类继承了Qmainwindow.如果你在mainwindow上按帮助是无法显示文档的.当你在qmainwindow上帮助,是有文档显示的.qmainwindow提供了应用程序的主窗口.a提供了一个应用程序,而w提供了一个a的窗口.对象w在执行时,会首先执行一个特殊函数,构造函数.这函数的特点是与类同名,且在形成对象时执行.所以当我们在上边执行完行7后按下,F11的时候就跳到了下图所示位置.下图中mainwindow:
:
mainwindow(参数).第一个mainwindow是类名,后一个是构造函数的名.2者之间用双冒号连接.
行8w.show();默认情况下该窗口w是隐藏的.所以这里使用了show显示.w是对象.对象可以使用类的公有参数和函数.如何使用呢.就用点(.)例如w.函数名.上边的a,你也可以使用a.我没用过.因为a不需要干预的.当我们输入w点后,QT会自动列出w所在类的可供使用的函数,参数等信息.你只需要按下键盘方向键移动光标选中行,找到需要的参数后按下回车即可.下图是QT的自动列出信息.
行9returna.exec();当我们的窗口w执行了显示后,我们的窗口就显示出来了.但这只是逻辑上的显示.实际你F10单步执行的时候,执行到了w.show();后发现窗口显示不出来或卡在那了.这是因为这个窗口需要和系统有一些消息交互.例如窗口需要通知操作系统我需要一些内存空间来进行显示,操作系统会分配一些可用内存给我们的窗口w.这个过程需要循环的进行.当我们执行点击按钮,也需要窗口w一直具有单击的功能.这也需要按钮周而复始的发送单击消息给我们的窗口w.这2种情况就是有应用程序类的对象a执行exec()完成的功能.
}
通过上面的叙述,我们就把主函数理解了.接下来我们的任务就是理解QT中的代码使用.由于大家创建工程的目的不同,所以实现功能的代码也不同.我只能根据自己遇到的情况讲解下.
什么是ui?
程序代码中最常见的就是ui.
ui是一个指针.当你按下F2的时候会自动跳转到它的定义处.
Ui:
:
MainWindow*ui;
*对象名或变量名,表示该对象或变量是个指针.这里说明ui对象是个指针.指针在引用参数时候,用指向操作符->.这个我们前边提到过.ui具有的意义,要看他所在的类.ui属于mainwindow类.与对象w一样.都是同一个类.ui使用时是ui->参数,w使用时是w.参数.经过这条语句的定义.那么ui就是指向设计窗口的一个指针,设计窗口又包含了我们拖入的各种控件,这意味着ui指针可以指向设计窗口中的各个控件.通过使用指针我们一样可以操作各个控件,赋予各个控件各种属性.例如我们第一章的例子改变标签和按钮的文本.例如ui->Lable,就是ui指针指向了标签控件.ui->lable->settext(),就是指针指向标签的’设置文本’属性.
如何使用QT中的常量
Windows编程中也会遇到许多的常量,例如windows中虚拟按键A对应着常量(0b)65;QT也有类似的常量定义.如图我们的键盘暂停按键,对应值为0x01000008.
那么在程序中,我们如何使用呢?
例如我们判断键盘A的输入状态,当我们在窗口中按下A键,就提示”按下了键盘A.就可以在按键事件(事件以函数的处理方式存在)中填写代码.如图.注意使用QT常量的时候,不要直接把A的数值写在程序中.而要写Qt:
:
Key_A.
可能朋友会有疑问,那我如何找到keypressevent事件或者说这个函数呢?
当在窗口上按下按键时,检测按键状态的应该是主窗口mainwindow.所以可以断定这个事件应该是在mainwindow中.我们找到mainwindow按下F2,可以看到的继承类是Qmainwindow.
我们在Qmainwindow上按下F1,可以转到帮助文档.点击下图所示的2个红框都能找到这个事件.那么可以看到这个事件不是Qmainwindow类自己有的,而是来自它的父类Qwidget类.
Qwidget类的事件位置如图所示.并且每个类都会有这样的小目录,方便我们查询.
如何产生鼠标的双击事件?
基本上通过测试,鼠标双击事件分解开,就是2次时间很短的单击事件.所以呢,测试过程中,我发现当我执行双击的时候,双击事件中的代码并没有被执行,而是执行了2次单击事件中的代码.经过上网搜索,找到了一个答案.QT没有自带的鼠标双击的方法,需要我们自己去写1个判断方法的代码.偷下懒,我把找到的资料直接贴出来.内容如下:
Qt中,在双击事件mouseDoubleClickEvent中会触发单击事件mousePressEvent事件,原因是:
(1).鼠标按下->弹起,一个单击信号就发射了
(2).在单击后的一段(很短)的时间内,鼠标按下->弹起,一个双击信号发射
(3)解决办法:
启动timer计时,在一段时间内,没有双击信号,则做出单击响应,否则做双击相应
(1)类的头文件中添加槽和计时器
注意:
加入槽函数是要加上Q_OBJECT宏
publicslots:
voidmouseClick();
private:
QTimer*timer;
(2)在构造函中timer=newQTimer(this);
connect(timer,SIGNAL(timeout()),this,SLOT(mouseClick()));
(3)单击事件注意:
根据我的测试时间间隔最小设为200,再小就不行了,不知道为什么,求解答
voidPaintArea:
:
mousePressEvent(QMouseEvent*event)
{
timer->start(200);
}
(4)双击事件voidPaintArea:
:
mouseDoubleClickEvent(QMouseEvent*event)
{
timer->stop();
//双击要做的事
}
(5)槽函数voidPaintArea:
:
mouseClick()
{
//单击要做的事
}
QT兴趣小组群218967017
2013.3.4