0.前序
别问,问就是选修...
那毕竟3dMax动画那边结课了,我怎么就不能再发一篇笔记(极其嚣张)
QT其实会去好好学的,虽然最近为了选修结课又得恶补一波
不过以后给策划造编辑器是要用的,这篇笔记以后系统去学习QT的时候会进行再更新
(但应该是年后的事情了)
本篇笔记主要是记录QT库中的一些方法和特性的使用
针对具有C/C++面向对象基础以及一定开发经验的人(主要是我自己^_^)进行查阅
重在了解工具的使用,而不在C/C++语法,面向对象这些方面
(总之不适合初学编程的小白去看就是了...更像是给有经验的开发者的QT使用说明)
版本:QT 5.13.1
欢迎各路神仙留言指正或是指教一些我不知道的点
若能不吝赐教,鄙人先谢为敬
VS中创建出的QT GUI Application项目介绍
包含:
main.cpp 入口点
一个QtGuiApplication同工程名的窗口类,继承自QMainWindow
一份.ui可以被QTDesinger编辑的UI资源(类似CocosStdio创建出的.csb场景UI)
![21ec4080f1290c353469c9814209f173.png](https://img-blog.csdnimg.cn/img_convert/21ec4080f1290c353469c9814209f173.png)
有时可能会提示无法打开.ui文件生成的头文件
此时我们需要编译生成一次项目,之后再右键打开文档,并下滑
![905d0651c22268f28e951db2867bbe6a.png](https://img-blog.csdnimg.cn/img_convert/905d0651c22268f28e951db2867bbe6a.png)
![cf34012c9210d7081d926c6db7bf7882.png](https://img-blog.csdnimg.cn/img_convert/cf34012c9210d7081d926c6db7bf7882.png)
找到这个Ui的命名空间的定义,让动态编码确认到这个命名空间以及其中类名的定义
![47158a970cd9085e576174bde2fe03e6.png](https://img-blog.csdnimg.cn/img_convert/47158a970cd9085e576174bde2fe03e6.png)
![aec7ae0ace75e42575b9d5fe26d410db.png](https://img-blog.csdnimg.cn/img_convert/aec7ae0ace75e42575b9d5fe26d410db.png)
在头文件中加入下面的代码,保证win32平台下启用中文字符集,正常显示中文
#ifdef WIN32
一个简单的开始
我们在窗口类的构造函数中写入下面的代码,引入qpushbutton.h头文件
创建两个Button,设定父物体为this(窗口类QWidget),移动位置,并设定Button和窗口的大小,设定窗口的标题
这里窗口类在main函数中已经有创建并显示的对应方法,我们只需将Button绑定到窗口类上即可
#include
![534a01fc230a6dc7ea19f99c6d0c760e.png](https://img-blog.csdnimg.cn/img_convert/534a01fc230a6dc7ea19f99c6d0c760e.png)
QT的父子关系树
上面创建Button时有这样的一段代码
QPushButton
在QT中我们所创建的窗口,按钮等等控件,都继承自QObject,QObject子对象的构造函数都重载了传入另一个QObject对象,直接将父物体指定为传入的QObject对象,的构造方法
从而QT中以QObject对象形成了父子关系树
当父QObject对象被释放/析构时,其所有子对象也会被释放/析构
前面的Button也是因为成为窗口的子对象,而被容纳在了窗口中
否则前面的Button直接执行show方法,将被单另弹出,形成一个自己的窗口
![6484c7548dd4edcdda77ab3b2053e185.png](https://img-blog.csdnimg.cn/img_convert/6484c7548dd4edcdda77ab3b2053e185.png)
QObject---》QWiget(窗口)---》控件
定义自己的QT类
并通过QT的调试输出信息,延展对象树的析构关系
头文件
#pragma once
.cpp文件
#include
在窗口类构造方法中加入
myPushButton
运行结果
![b5015e1ea91ea0dc84fb5165b25a6ef1.png](https://img-blog.csdnimg.cn/img_convert/b5015e1ea91ea0dc84fb5165b25a6ef1.png)
![3395d484242c483ece3f9f638bd0f9ad.png](https://img-blog.csdnimg.cn/img_convert/3395d484242c483ece3f9f638bd0f9ad.png)
在QT中,尽量在创建时指定父对象,从而利用父子关系树,不需要过多的在意对象的释放问题
QT的窗口坐标系
![9ea1b1bc24bc39f7f67776aed6a4198a.png](https://img-blog.csdnimg.cn/img_convert/9ea1b1bc24bc39f7f67776aed6a4198a.png)
QT中的事件Event传递,采用信号槽机制
信号槽机制时观察者模式的一种
我们先定义出可以被观察者观察到的信号/消息的抽象,并提供挂载回调方法的机制(这要求我们应当在架构中将各种信号源进行归类,并创建出对象可能拥有的信号源的对应位点/槽位),同时定义信号/消息产生时需要被调用的方法(槽)(即回调的函数,在我们使用架构进行开发时定义,并通过一定的回调机制,例如委托,将方法递交给对象的信号槽位)
通过注册,我们将信号和槽位上的待调用方法进行绑定,当信号/消息发出时,发出信号/消息的一方,需要依次遍历所有注册了该信号对应槽位的方法,将信号/消息传入
我们需要在开发时,通过注册才能绑定消息和事件,消息和事件两方本身没有关联,通过注册操作才被联系到一起,是一种松散的耦合关系
QT的架构已经为我们准备好了这样的一种事件机制,将信号/消息,在类中以虚方法呈现,并参与到类的继承关系中
我们只需在开发时,定义出槽函数,并进行注册/链接,将某个对象,的某个信号/消息,与我们开发时所写的某个对象的某个方法,进行绑定即可
Button的Signal方法与简单的绑定示例
对于一个Button,它所拥有的信号类型包括
Click,Pressed,Released,Toggled
![9cfbe939b3c15dffd8000d10d4c821ed.png](https://img-blog.csdnimg.cn/img_convert/9cfbe939b3c15dffd8000d10d4c821ed.png)
![fc62caa3da585f486f1f985d923bdd15.png](https://img-blog.csdnimg.cn/img_convert/fc62caa3da585f486f1f985d923bdd15.png)
对一个Button绑定关闭当前窗口的事件
connect
要注意的是,
信号源在QT中通过一种特定的Signal方法,QT中的对象树中有预定义的参与继承的Signal方法,我们也可以自定义/重载自己的Signal方法,我们只能指定这种特定的Signal方法参与链接
槽函数并不能随意创建指定,而需要指定QT中一种特定Slot方法,与Signal方法一样,QT对象树种有预定义参与继承的Slot方法,我们也可以自定义/重载Slot方法
下面会讲到自定义Slot和Signal方法的一些要求
自定义信号和槽
我们创建了如图所示的工程
包含:
MyWindow窗口类,继承自QMainWindow
MySignal包含信号发出方法的自定义类,继承自QObject
MySlot包含槽方法的自定义类,继承自QObject
![f06aa921ea3cc9bfaffb7bece9f983d4.png](https://img-blog.csdnimg.cn/img_convert/f06aa921ea3cc9bfaffb7bece9f983d4.png)
首先我们在MySignal中实现自定义的信号发送方法
QT为我们特别提供了signals:描述块,我们自定义的信号发送方法写在signal块下即可
并且对于自定义的信号发送方法要求:并且对于自定义的信号发送方法要求:
1.返回值必须为void
2.只需要声明,不需要实现
3.可以有参数,可以重载
#pragma once
之后我们在MySlot中自定义槽方法
QT5.4版本之后,槽方法可以直接写作public块下(之前的版本要求写在public slot块中)
并且对于自定义的槽方法要求:
1.返回值必须为void
2.需要声明,也需要实现
3.可以有参数,可以被重载
#pragma once
#include
我们在MyWindow中实例化出MySlot和MySignal,并使用conne进行信号槽的链接
在调用发送方法时,我们需要使用emit关键字,从而去遍历所有注册该信号函数的槽方法
#pragma once
#include
运行时的输出结果
![c2ffff148e7a00227f146084d9721b0d.png](https://img-blog.csdnimg.cn/img_convert/c2ffff148e7a00227f146084d9721b0d.png)
引入信号方法和槽方法的参数
QT中的字符串常用QString类型
我们为之前创建的信号方法和槽方法引入一个Qstring的参数
信号方法合槽方法的参数需要匹配,触发时槽方法才能获得信号方法的传入参数
![e8d541160cd94bdcdb8430d71e1f7440.png](https://img-blog.csdnimg.cn/img_convert/e8d541160cd94bdcdb8430d71e1f7440.png)
![cf462bbfc54ae1572c828f1daec64af4.png](https://img-blog.csdnimg.cn/img_convert/cf462bbfc54ae1572c828f1daec64af4.png)
此时由于信号方法和槽方法有重载,我们之前的注册写法,将提示无法确认需要使用的重载
connect
我们需要通过函数指针的方法去确定需要使用的重载
mSignal
触发带参数的信号方法,输出结