qt 子窗口写到线程就卡死_学习笔记 --- QT

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

有时可能会提示无法打开.ui文件生成的头文件

此时我们需要编译生成一次项目,之后再右键打开文档,并下滑

905d0651c22268f28e951db2867bbe6a.png

cf34012c9210d7081d926c6db7bf7882.png

找到这个Ui的命名空间的定义,让动态编码确认到这个命名空间以及其中类名的定义

47158a970cd9085e576174bde2fe03e6.png

aec7ae0ace75e42575b9d5fe26d410db.png
此时这里的错误提示会消失,我们就可以正常的在代码中使用ui这个字段了

在头文件中加入下面的代码,保证win32平台下启用中文字符集,正常显示中文

#ifdef WIN32  

一个简单的开始

我们在窗口类的构造函数中写入下面的代码,引入qpushbutton.h头文件

创建两个Button,设定父物体为this(窗口类QWidget),移动位置,并设定Button和窗口的大小,设定窗口的标题

这里窗口类在main函数中已经有创建并显示的对应方法,我们只需将Button绑定到窗口类上即可

#include 

534a01fc230a6dc7ea19f99c6d0c760e.png

QT的父子关系树

上面创建Button时有这样的一段代码

QPushButton

在QT中我们所创建的窗口,按钮等等控件,都继承自QObject,QObject子对象的构造函数都重载了传入另一个QObject对象,直接将父物体指定为传入的QObject对象,的构造方法

从而QT中以QObject对象形成了父子关系树

当父QObject对象被释放/析构时,其所有子对象也会被释放/析构

前面的Button也是因为成为窗口的子对象,而被容纳在了窗口中

否则前面的Button直接执行show方法,将被单另弹出,形成一个自己的窗口

6484c7548dd4edcdda77ab3b2053e185.png

QObject---》QWiget(窗口)---》控件


定义自己的QT类

并通过QT的调试输出信息,延展对象树的析构关系

头文件

#pragma once

.cpp文件

#include 

在窗口类构造方法中加入

myPushButton

运行结果

b5015e1ea91ea0dc84fb5165b25a6ef1.png
运行时

3395d484242c483ece3f9f638bd0f9ad.png
退出后

在QT中,尽量在创建时指定父对象,从而利用父子关系树,不需要过多的在意对象的释放问题


QT的窗口坐标系

9ea1b1bc24bc39f7f67776aed6a4198a.png
和游戏开发的常用的左下角窗口坐标系有所区别,和TiledMap一致

QT中的事件Event传递,采用信号槽机制

信号槽机制时观察者模式的一种

我们先定义出可以被观察者观察到的信号/消息的抽象,并提供挂载回调方法的机制(这要求我们应当在架构中将各种信号源进行归类,并创建出对象可能拥有的信号源的对应位点/槽位),同时定义信号/消息产生时需要被调用的方法(槽)(即回调的函数,在我们使用架构进行开发时定义,并通过一定的回调机制,例如委托,将方法递交给对象的信号槽位)

通过注册,我们将信号和槽位上的待调用方法进行绑定,当信号/消息发出时,发出信号/消息的一方,需要依次遍历所有注册了该信号对应槽位的方法,将信号/消息传入

我们需要在开发时,通过注册才能绑定消息和事件,消息和事件两方本身没有关联,通过注册操作才被联系到一起,是一种松散的耦合关系

QT的架构已经为我们准备好了这样的一种事件机制,将信号/消息,在类中以虚方法呈现,并参与到类的继承关系中

我们只需在开发时,定义出槽函数,并进行注册/链接,将某个对象,的某个信号/消息,与我们开发时所写的某个对象某个方法,进行绑定即可


Button的Signal方法与简单的绑定示例

对于一个Button,它所拥有的信号类型包括

Click,Pressed,Released,Toggled

9cfbe939b3c15dffd8000d10d4c821ed.png
注意是clicked方法作为Signal方法

fc62caa3da585f486f1f985d923bdd15.png
Toggle是将Button当作一个Toggle的情况下

对一个Button绑定关闭当前窗口的事件

connect

要注意的是,

信号源在QT中通过一种特定的Signal方法,QT中的对象树中有预定义的参与继承的Signal方法,我们也可以自定义/重载自己的Signal方法,我们只能指定这种特定的Signal方法参与链接

槽函数并不能随意创建指定,而需要指定QT中一种特定Slot方法,与Signal方法一样,QT对象树种有预定义参与继承的Slot方法,我们也可以自定义/重载Slot方法

下面会讲到自定义Slot和Signal方法的一些要求


自定义信号和槽

我们创建了如图所示的工程

包含:

MyWindow窗口类,继承自QMainWindow

MySignal包含信号发出方法的自定义类,继承自QObject

MySlot包含槽方法的自定义类,继承自QObject

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

引入信号方法和槽方法的参数

QT中的字符串常用QString类型

我们为之前创建的信号方法和槽方法引入一个Qstring的参数

信号方法合槽方法的参数需要匹配,触发时槽方法才能获得信号方法的传入参数

e8d541160cd94bdcdb8430d71e1f7440.png

cf462bbfc54ae1572c828f1daec64af4.png

此时由于信号方法和槽方法有重载,我们之前的注册写法,将提示无法确认需要使用的重载

connect

我们需要通过函数指针的方法去确定需要使用的重载

mSignal 

触发带参数的信号方法,输出结

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值