目录
关于控件
一个图形化界面上的内容,不需要咱们全都从零去实现
Qt 中已经提供了很多内置的控件了(按钮,文本框,单选按钮,复选按钮,下拉框.….)
控件的英文 widget,我们是非常眼熟了,在前面的学习中,创建新项目时,选择继承的父类是 QWidget,最终Qt会基于 QWidget,自动生成一个继承自 QWidget 的类 Widget
控件是界面上的各种元素,各种部分的统称
在 Qt Creator 中,点开 widget.ui 文件
Qt Designer 左侧的这一长条, 就是 Qt 给咱们已经内置好的控件了:
如果现在进行的操作,是属于程序一启动之后要呈现的一个效果,就设置在构造函数中
QWidget核心属性
Qt 中的各种控件都是继承自 QWidget 类
Qt Creator 右侧, 可以看到 QWidget 的各种属性,并且在这里也能直接进行编辑:
这些属性不需要大家每个都去了解,只需要认识其中的一些常用的、重要的属性即可
enabled
enabled 描述了一个控件是否处于 可用 状态
与 可用 相对的概念是 禁用:
-
所谓"禁用"指的是:该控件不能接收任何用户的输入事件,并且外观上往往是灰色的
-
如果一个 widget 被禁用,则该 widget 的子元素也被禁用
获取和设置 enabled 的状态:
API | 说明 |
---|---|
isEnabled() | 获取到控件的可用状态 |
setEnabled() | 设置控件是否可使用,true 表示可用,false 表示禁用 |
下面创建一个项目,采用纯代码的方式创建一个按钮
将按钮设置为禁用状态,并关联槽函数:
运行程序,观察效果,按钮是灰的,点击没有反应:
上面这种方式是在构造函数中直接禁用,下面采用点击其他按钮的方式禁用
在同一个界面中,要求不同的控件的 objectName 也是必须不同的(不能重复)
后续就可以通过 ui->objectName 方式来获取到对应的控件对象了
此时采用图形化的方式创建按钮:
此时:
ui->pushButton // 可以得到第一个按钮对应的对象
ui->pushButton_2 // 可以得到第二个按钮对应的对象
这就是元编程,Qt 会根据 ui 文件,生成一个 ui_widget.h 文件
生成的过程中就会感知到界面上都有哪些控件,以及每个控件的objectName
当前自动生成的 objectName 是有规律的,这个名字就是根据控件的类型 +下划线 + 数字
但是很明显,以数字的方式命名,不是一个好的编程习惯,因为无法明确表达含义
所以将 切换可用状态 按钮的 objectName 改为:pushButton_enable:
此时将两个按钮都转到槽,自动生成槽函数,一个执行 qDebug,一个切换 enabled状态:
运行程序,点击第一个按钮,会打印日志:
点击 切换可用状态 后,第一个按钮变灰:
再点击 切换可用状态,第一个按钮 又恢复正常:
geometry
可以把 geometry 看做 x、y、width、height 这四个属性的统称,也就是表示当前空间的位置和尺寸
具体如下图所示:
获取和设置 geometry 的状态:
API | 说明 |
---|---|
geometry() | 获取到控件的位置和尺寸,返回结果是一个 QRect 其中x,y是左上角的坐标,包含了x、y、width、height |
setGeometry(QRect) setGeometry(int x, int y, int width, int height) |
设置控件的位置和尺寸 可以直接设置一个 QRect,也可以分四个属性单独设置 |
move 和 geometry:
-
move 只是修改位置
-
setGeometry 既可以修改位置, 又可以修改尺寸
下面使用图形化界面的方式创建一个 pushButton,改名为 target:
并将其 objectName 改为 pushButton_target:
再创建一个 按钮,改名为 up:
也将其 objectName 改为 pushButton_up:
再复制三份和 up 按钮大小相同的按钮,也将它们的 objectName 改为按钮名,最终变为:
我们期望通过点击这几个按钮,就能够修改 target 按钮的 geometry
下面通过右键,生成这四个按钮的槽函数,来控制 target 按钮的位置和大小
需要注意,这里的坐标系是左手系,所以向上移动是 - y,向下移动是 + y
当前代码实际执行的效果,是在调整左上角位置,左上角位置改变的同时,高度和宽度也同时发生了改变
如果想要让这个按钮能够平移(宽度高度不变,整个按钮的位置都发生改变)
刚才的代码,修改的是 QRect 对象的 x和 y,这样的修改就会使 QRect 宽度高度发生改变
如何才能实现"平移"的效果,保持尺寸不变,整个按钮位置变化?
即不再修改 QRect,而是通过 QRect 基于 setGeometry 第二个版本的函数,重新设置位置即可
运行结果如下,就实现了按钮的位置发生改变的需求:
女神表白模拟器
首先在 图形化界面,标签上输入一行文本:女神女神我喜欢你,能不能做我女朋友呀
下面两个按钮,一个是欣然同意,一个是残忍拒绝
下面利用 geometry 控件,能够做到:
女神点击同意按钮时,正常显示文本,邀请女神去吃饭
女神点击拒绝按钮时,拒绝按钮刚一按下,还没松开,就随机变换位置,让女神点不到
首先界面如下所示: