13.QT实战编程

 

 

 

 

mingw推荐中文乱码使用

 

 

 

 pro 类似于vs开发中有个.sln 双击之后项目就可以打开了

 

 5版本以上多了一个QtWidgets模块 

 

 

 

防止头文件重复包含 

 

帮助文档👆 

没有智能提示,因为没有包含类的头文件

 this指向当前的指针 中文正常显示是因为 UTF-8 

 

 

 

 

 创建对象的时候基本上 用new 创建的,但是从来都没有写delete 这些对象有没有释放掉呢?其实在我们程序执行完之后他都会自动释放掉,而且会调用他的析构把它释放掉 在栈上的东西他最终有个优点 一定程度上简化了内存回收的机制 一定程度上指定了一个父亲 this 包括构造的时候指定this 而且这个父亲是由QObjict或者由QObjict派生下的类,来作为他的父亲的话,那么这样的对象你就不用管理他的释放  我们窗口执行完之后,他会自动的释放,

 

 

 

 包含头文件

 setparent 加到树上

 

 当你把这个窗口对象登记的时候,先调用这个~MyWidget 析构函数,调用这个函数之后呢,找一下这个函数的儿子。看他有没有儿子,如果他有儿子,再调用他儿子的析构,然后他其实并没有把这个对象真正的释放掉,他只是调用了他这个函数~MyPushButton,比如他这里面由其他的操作,比如说delete操作,他会调用这个函数,调用他这个函数~MyPushButton,看他有没有儿子,他没儿子 他是最后一个儿子,mybtn 当他确实没有儿子的时候,他会把这个对象真正的释放掉  把他mybtn 释放完之后, 看他的父亲MyWidget看有没有儿子,如果他也没有儿子 确实没有儿子了,一个儿子也没有了 再把它释放掉,所以打印的时候,确实是先打印他父亲的释放 先打印他父亲的释放然后再打印他的 ,,   这个时候他没有真正的释放,只是打印他的析构代码,然后再找他的儿子,儿子里面的析构也打印出来他  然后确实没有东西了,才一层一层 往回释放掉

创建的时候先有爸爸再有儿子,释放的时候先释放儿子再释放爸爸

 

 

 

 

 

 

 

 *parent 相当于指定了一个父亲,当我这个this的时候相当于我挂到对应树上面了 new出来的对象我就不用管他的释放了 

处理的槽函数&Student::treat 就把这个信号槽连接起来了

 

 

 

 

 

发生重载的时候, 你需要在连接的时候,利用函数指针明确指向出来 到底是哪个参数,有参还是无参,包括上面的也运行不起来了,这上面这个你要想运行起来,你必须要自己用这种方式指定出来无参的才行,因为我们现在已经在这个信号也好,槽也好,都已经有重载的版本了,

 char* Qstring如果要拼接的时候,就会加 “ ” 拼接

 

 

include<QPushButton>

 

 

 信号的个数,可以多余槽函数个数,反之不可以,你可以多传几个东西过来,我可以不接,但是如果我需要这些参数的话你必须要传,传的这个地方 参数可以多,但是接的地方不能多,但是类型必须要一 一对应,其他的个数 前面的个数也要类型一一对应,

 

 不太推荐👆运行起来才报错误,本质变成字符串,对于字符串而言,他根本不会做任何对比

 

 

 &会出错:锁的状态这个时候是只读了,但是要修改里面的东西,是写的状态,所以导致用btn4本身设置里面的东西就会出现问题,但是用=相当于他通过btn4拷出一个新的指针,但是他俩的指针指向是一样的都指向同一个按钮 这时候就不会出现问题了,不能用他的本身自己去做,而是你必须要拷出一个新的东西然后去做,这也就是为什么最常用的是使用[=](){} 本身指针做一个拷贝的操作 就4个字节 也不会浪费太多 所以也不用考虑效率的问题

 

invalid use ofincomplete 错误,注意有没有包含头文件 

如果是值传递,他不会动你本身的 但是如果mutable不加 代码是跑不起来的

 

 

 一个按钮可以访问多个槽函数,一个信号可以绑定多个槽函数,

 如果你用的是lambda表达式this可以不用加👇

 

 

 没有智能提示 说明头文件没有包含,

 

 

 

 

 

状态栏没有拖拽的方式,还是用代码写去就好了,

 图标,

 项目右键,添加新文件,

 

 

 

人物的分类,怪物的分类,还有其他的分类,道具的分类,这个时候,你会加一个前缀作为区分,

如果你没有区分的话,比如说最简单的, / 就行了, 

接下来添加文件, 选中所有的,他没有打进你的项目中,如何打进你的项目中?

点击一下编译

 

 对话框的创建,右键移除不想要的控件,如何点击 按钮让他去相应一个具体的东西,点击之后创建对话框,少于116*30会报警告提示,

 

 

 

 一闪而过,原因他是没有阻塞状态,这个对象创建是在栈上,[=](){}这是一个lambda表达式本身是一个函数体,函数体栈上的东西,  这个函数执行完之后就释放掉了  上面exec阻塞的不会释放,而下面的show 执行完函数体,被栈释放掉 解决:给他创建到堆区

 只关闭没有释放,有人测试这个问题,点7天7夜有可能会崩,对象一直在创建,没有被销毁掉 等于一直在创建新的窗口,

从父类找  

 

 

 当创建对话框,如果给他关闭掉,没有delete释放掉,当我点击close的时候就把对话框delete释放掉

 

 

 

 

 

 第五个参数默认关于回车的按键

 返回按钮就是标准按钮返回类型 

 

 

 

 

 

 

 

 

 

 

打破布局 

 

垂直布局👆

 

 

 

 

 

密码 什么都不显示 

 

 

 

常用的控件

 

 

 

 

 

 

 

 

 

透明突起

 

 

 默认选中

 

 

 

 

 

复选框不是用click

 形参列表可以接

选中是2 没选中是0  1 去哪里了? 1 是半选状态

 

 Item Widgets 没学过数据库 现在用不了

 

 

设置水平居中

 

 

 

 list用到时候他重载了 左运算符

没有 需求居中对齐的时候可以一次性给他打印出来 

树控件

垂直布局

 每一个小的项目都叫 item

第一步 把头加进去

匿名对象一次性把数据全都 拼接过来

 树首先得有一个根

 

 

表格 

 

 

一个抛异常 一个不抛异常, at抛异常

 

 

 常用小控件👇

 

 

 

切换标签

 

 

 栈容器,栈控件

 运行后没有箭头 怎么做?

 

 

 

 

 

 

 

 

 

 

字体下拉框

密码模式 

区别 有倾斜 有下划线 左边加粗倾斜下划线,右面只能 编辑文本

购物 买多少个 

后面自定义控件

显示标签 显示文本  图片 

 

box

id  图片 加载的操作,

 

 

 可以显示动图,

 

 

自定义封装进度条

 

 

 

 右键提升为

点击添加  提升

 两个控件封装一起了,

全局包含

值被改变了 我们要做的事情就是监听这个 信号   有重载版本,做信号槽链接就需要指针了

中括号没有加=   所以说他看不到里面的所有控件 拉姆达表达式最常用的是 [] (){} 里面是=

 

 

 

 

右键添加新文件

 不需要设计师 ,不需要重新设计ui

 对他进行集成

第一  include public修改

 第二给父类进行初始化的时候修改

 

 

 

 默认的qlabel是拿不到里面的源码的,不可能qlabel底层对他代码的捕获,所以先写一个自定义的类mylabel  然后自己写的mylabel 需要做提升 之后就可以写 事件了

 重新实现 修饰的时候都是用的virtual 相当于都是虚函数, 你可以给他进行重新实现 鼠标事件 都是monse  移动  按下 释放 

重写 virtual 可加可不加

 可以捕获到信息,坐标系  x  y

 

左上角 值小

 左键 打印 ,右键 不打印

所有的鼠标参数都在ev中,

button 通过按键 来看他到底按的是什么

常用的枚举值

midbutton鼠标滚轮  

鼠标左键 打印一段话,

 鼠标左键 移动的时候没有 按下和释放有

鼠标按下和释放都是瞬间状态,而移动是个持续的状态,在持续状态中,我可以切换按键,我可以把这个键修改掉的,这个时候你就不能用 简单的button判断了, 因为button值对一个按键来做瞬间的判断

buttons 组合按键  左键 右键 中键

不能用==号判断  用位操作符

如果这个位和他的位 完全一样那么这个时候 位与的操作全真才为真

只要过程中修改了值,两个键同时按下,那么这个值肯定不是刚才的00001可能会修改成其他的值,这个时候不会进入里面的内容

 只要移动我就打印,设置鼠标的追踪

 

qlabel 定时器,数字累加的操作

添加定时器

 构造函数中开启定时器

 

加个static 不会重新初始化,只会初始化一次 

加qlabel 两秒跑一次

 怎么判断1秒钟定时器走这 个   两秒钟定时器走这个?

启动timer的时候 有一个返回值,int是定时器的唯一标识

QTimerEvent中可以判断标识

区分定时器用

 

 

 

 0.5秒钟跑一次

 定时器比较多的时候,你需要创建一个新的对象, 但是用第一种方式,所有的判断都要写在一起

一个比较独立,你监听的话,就监听一个定时器对象就好了, 我比较推荐使用第二种定时器

 

 

事件分发器

 

 

 

 双击  释放  移动 

通过事件分发器做拦截工作

 如果鼠标按下 做拦截,

拦截事件 不向下分发

 把父类转成子类的数据类型,强转,

  

 不打印这段话了,释放没有做,释放还是刚才的那一些操作 在event return true 然后他就不往下分发到MousePressEvent了。而这一层已经拦截掉了

目前不建议拦截操作,你要处理操作,你要具体找对应的代码,  如果鼠标按下你还具体找MousePressEvent 鼠标释放,你还需要自己找miouseReIeaSeEVent

而不是在这一层做拦截操作,因为这一层,处理逻辑非常复杂,因为所有的事件都在这里面64行,一旦你写错了一个很有可能会影响到其他的事件

主要给用途 用于分发事件,不是拦截事件

 

 应用程序里面先把数据捕捉到,捕捉到之后,交给事件分发器进行分发,

事件过滤器,做更高一级的拦截

 

 

 

 画图

 

 

 设置画笔宽度

 

画刷,封闭的图案

 

颜色枚举值

 

 

 

 

有点透明度了

 

 

 

 

还是三个矩形,但是 两个重叠了 

有些资源,可以用画家把准备好的资源直接画到窗口中

qt不让你运行,关了重开就可以了

逻辑代码还要写到构造函数中,

 

 

 

 

 这次不是往当前窗口上画,需要一个指针 相当于指定一个指针 往这张纸上画画,刚刚指定的是this 相当于是widget 的父类是qwidget 也可以作为绘图设备,那怎么验证他是绘图设备呢?

绘制圆形,圆心 

  

 

 需要指定色位 一般都是用32位的

画的是绿色的⚪

 

 pic设备, painter画家

可以随意指定后缀格式  只是记录一些命令,如果想重现这些命令  需要你的代码去重现

 

 

 

 

 可以隐式转换,把QByteArray转换成Qstring数据类型,

 

 先读取第一个字符看是什么格式,然后再根据格式进行读取

可以一行一行的读,

 写的操作

文件操作,关掉

关掉可以打开它,重新写用writeonly 或者readwrite  追加用append 

读完之后才写的,验证需要打开源文件 

文件信息管理类

 

 

 

 

 有开始  菜单栏 所以用qmainwindow

 

 

 指定宽和高,

  

 

缩放代码  调整位置

 

 

 也可以用qpixmap 20

圆形按钮

 

 右键 添加新文件  class  默认的实现不要,自定义一个实现

 语法错误, 声明和实现 只有一个有,

 

 

 

 

 设置零边框,图标大小

 监听信号槽

 

 button 提供接口

目标,用哪种方式, 

设置防止他的堆区泄露

 

执行完动画之后释放掉

 

 

 

 

选中关卡

 

 

 主场景隐藏掉,创建新的场景

 第二个场景初始化,需要做哪些事情?

 画背景图 重写绘制事件

 

 

画背景图

 

 

 

 关卡  返回按钮

 

监听一下他的响应

切图 状态没有改变

鼠标按下  鼠标释放 

 

 

 按钮响应事件跑给父类

 

 

 

 点击响应返回出来

 两个场景切换怎么做?

第二个场景按返回 ,把原来的显出来,但是拿不到第一个场景,

怎么把这些消息告诉主场景 ,让主场景控制控制它,让主场景重新的显示? 而第二个场景再隐藏呢? 两个场景切换  有个主次关系,主场景能拿到次场景 但是第二场景拿不到主场景的指针, 大的方向 主场景是一个核心场景,它可以监听一些信号出来,比如说在这个 第二个场景中   他点击了返回按钮,会发送一些信号 告诉他,我点击了返回,那么主场景 会监听出来这个信号,并且执行出来 让第二个场景隐藏掉  并且让主场景重新的显示  这个就相当于抛出一个自定义信号出来,

请老师吃饭 自定义信号

先抛出这个信号 

 

 

主场景 监听信号

 只要场景创建出来就可以监听这个信号

 加延时

 

 

 选择关卡的小按钮

排列方式 是矩阵

除法控制列,取模 控制他的行

面试题,for循环写一个矩阵

 

 间距,

 

 不规则按钮,一般不使用settext 因为不方便调整这个text的位置

 不要原生的  手写一个label

兰姆达 = 这个里面的所有的可见变量的值都可以看到

label设置大小跟按钮一样大

 label文本对齐方式默认是左对齐  改成居中显示  水平居中

 

 水平局中之后,垂直居中就没了

label吸收了点击事件,没有穿透下去

label设置鼠标穿透事件,自己不处理,然后接着往下穿 穿到下一层

 

 

 

 

 

 

 

 先给他一个野指针,一开始不创建,给他一个空,​​​​​​​

 第三场景,宽高  标题,

 

 画背景图   绘图事件

 

 返回按钮 场景

 必须有这个对象,new之后,

监听返回应该删掉

第三层 

 用户看到显示多少关

宽高大小 设置字体

 ​​​​​​​

 两个for循环

 ​​​​​​​

 如果资源改动 代码也要改动,所以修改成👆

金币不需要上下跳跃,重新写个类 ​​​​​​​

实现默认构造,有参构造

 ​​​​​​​

 创建金币

 

 每关都应该有不同的显示效果,

 

配置文档👆

右键添加现有文件

 数组嵌套数组  是二维数组

key是关卡,第一关的二维数组是什么。。。

 

 

 ​​​​​​​

 

 

 

 

  

 

 

 定时器在构造里面初始化

 

 

 银币翻金币的定时器

 

 疯狂点击 翻币 执行完之后才能执行下一个动画

 

 

 

 

 

 

 

 

 两个for循环每一个按钮是独立的,是重新new的按钮,点击的时候,找同一个或者上一个找不到了  不妨加一个二维数组,存放的是按钮的二维数组,

方便找到金币的上下左右

 

 

 

 

 

 

 

 

 全是金币不要点了 胜利了  

 

 

  

 胜利,还没有屏蔽每一个按钮

 

 

 问题 手速快,0.5秒其他按钮也点了 屏蔽其他按钮

先开启 再检查游戏胜利 

 

胜利图片

 准备好了,胜利之后往下砸

 

 ​​​​​​​

 

 

 

 

 

 

 

重复5次,循环播放设置成-1 

 

 

 

 

 

 

 

 

 

 

 

 

 场景之间的位置

  

 

第一个场景 第二个场景位置同步了👆 

 还没删到场景第三个场景之前获取他的位置👆

计时  加保存  读取 放文件读取出来

lua写的游戏

 这个打不开  是因为你没有配置环境变量, 把qt环境变量配置一下 👆

没安装qt怎么玩这个游戏?

切换👆 看能否跑起来

拷走 复制桌面

 如果有这个程序说明是可以打包发布的

 shift 右键

打包操作 

 

这些东西就可以拿给朋友玩了 👆

缺少dll说明缺少本身系统少了一些库的dll文件,上往上找一下 下载就可以了

对于我们qt而言 所有的动态链接, 核心的dll文件 他全都打到这里面了,

如果打包还不够完善,可以用第三方的工具,再做一次打包,比如说生成一种setup的文件

一般安装游戏的时候会有这样一种文件, 然后给他安装到项目中 , 你的开始菜单就会有这个东西  包括菜单里面 就会有这个游戏,这是第三方打包

 许可 随便提供一个txt文档就行了

 

清空👆

 树-->选择所有的dll  打包

打包生成 这个👆

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值