【Qt】常用控件2——按钮类控件
目录
一. PushButton
1.1.示例1——带有图标的按钮
1.2.示例2——带快捷键的按钮
1.3.示例3——按钮的重复触发
二.QRadioButton(单选按钮)
2.1.示例1——选择性别
2.2.示例2——click,press,release, toggled 的区别
2.3.示例3——单选框分组
三.QCheckBox(多选按钮)
QWidget 中涉及到的各种属性/函数/使用方法,针对接下来要介绍的 Qt 的各种控件都是有效的~~
一. PushButton
使⽤QPushButton 表⽰⼀个按钮。这也是当前我们最熟悉的⼀个控件了.
QPushButton 继承⾃QAbstractButton ,这个类是⼀个抽象类.是其他按钮的⽗类.
在QtDesigner中也能够看到这⾥的继承关系
我们在.ui文件里面放置一个QPushButton
我们在右边属性框,就能看到下面这些
作为 QWidget 的子类,QAbstractButton 自然继承了 QWidget 的所有属性和方法。这意味着所有适用于 QWidget 的特性(如尺寸控制、可见性、样式表等)在 QAbstractButton 及其子类(如 QPushButton)中同样可用。
然而,QAbstractButton 也提供了一系列自身独有的属性和功能,主要用于处理按钮的通用行为和状态。这些属性主要包括:
-
文本和图标:设置按钮上显示的文本和图标;
-
选中状态:如是否被选中(对于可选中按钮),对应
isChecked()
和setChecked()
; -
快捷键:支持设置键盘快捷键触发按钮点击;
-
自动重复:是否在长按时连续发射点击信号;
-
排他性:是否在按钮组中具有独占选中行为(如单选按钮);
-
点击状态:是否被按下、是否悬停等。
事实上,像 QPushButton 这类具体按钮的核心功能——例如获取和设置按钮状态、处理点击行为等——都是由 QAbstractButton 提供的基类机制实现的。而其自身所提供的额外属性(如 QPushButton 的扁平化样式 flat
)则相对简单,多用于外观调整。
因此,在设计按钮类控件时,大部分通用行为均来自 QAbstractButton,而具体子类主要扩展的是视觉和交互细节。
以下是 QAbstractButton 及其子类 QPushButton 中常用属性的表格说明:
属性 | 类型 | 说明 |
---|---|---|
text | QString | 按钮上显示的文本内容 |
icon | QIcon | 按钮上显示的图标 |
iconSize | QSize | 按钮上图标的尺寸 |
shortcut | QKeySequence | 按钮对应的键盘快捷键 |
autoRepeat | bool | 是否启用自动重复触发功能 当鼠标左键按住不放时: - true: 持续产生点击事件(类似游戏手柄的"连发"效果) - false: 必须释放鼠标再次按下才能产生点击事件 |
autoRepeatDelay | int | 自动重复触发的延时时间(毫秒) 按住按钮多久之后开始重复触发 |
autoRepeatInterval | int | 自动重复触发的周期(毫秒) 开始重复触发后,每次触发的时间间隔 |
1.1.示例1——带有图标的按钮
我们创建一个新项目
首先我们先去网上找一个图片,作为按钮的图标
如果大家不知道该去哪里寻找图片,我给大家推荐一个网址:iconfont-阿里巴巴矢量图标库
接着我们创建一下qrc文件
注意这里不能带中文
点击完成
注意:我们需要提取将图片资源放置到我们qrc文件所在目录或者其子目录里面
添加成功
他的objectname是pushButton
怎么样??还是很不错的吧!!
当然,如果你觉得太小,也可以进行调整
还不错吧。
1.2.示例2——带快捷键的按钮
我们之前写过一个例子,控制target按钮的移动,之前是通过鼠标点击按钮来实现的。
此处我们可以引入快捷键来操作,也就是通过按键盘来实现target按钮的移动。
我们创建一个新的项目
首先我们需要准备一些图片,大家可以去:iconfont-阿里巴巴矢量图标库
接下来我们创建一个qrc文件
接着我们创建一下qrc文件
现在我们把他们全部复制到我们的qrc文件
注意我们需要提取把资源拷贝到这个qrc文件所在目录或者其子目录
全部添加进来。现在qrc文件就创建好了。
接下来我们来创建一下我们的项目
五个按钮的objectName分别为
- pushButton_target
- pushButton_down
- pushButton_up
- pushButton_left
- pushButton_right
⽂本内容均清空
我们先把图片加载到这个按钮上面来
很好是吧。我们现在就来给这些按钮设置槽函数
转到下面(注意,另外3个按钮设置槽函数的过程我们就省略了,我们直接看代码)
运行一下
点击10下left按钮
点击10下down按钮
……反正就是能正常使用
但是我们现在这个项目的核心功能还是没有实现。(快捷键)
设置快捷键的函数——setShortcut
- 示例 1:使用标准快捷键 (Recommended)
Qt 内置了很多标准操作的快捷键,这是最推荐的方式,因为它会自动适应不同操作系统的约定。
// 在你的类构造函数或初始化函数中设置,例如 MainWindow::MainWindow()// 设置按钮快捷键为“打印” (Ctrl+P)
ui->printButton->setShortcut(QKeySequence::Print);// 设置按钮快捷键为“保存” (Ctrl+S)
ui->saveButton->setShortcut(QKeySequence::Save);// 设置按钮快捷键为“撤销” (Ctrl+Z)
ui->undoButton->setShortcut(QKeySequence::Undo);// 设置按钮快捷键为“复制” (Ctrl+C)
ui->copyButton->setShortcut(QKeySequence::Copy);// 设置按钮快捷键为“查找” (Ctrl+F)
ui->findButton->setShortcut(QKeySequence::Find);
但是这也不好记忆啊!!所以有下面这些
- 示例 2:使用组合键(修饰键 + 键位)
这是最灵活的方式,你可以自由组合 Ctrl
, Alt
, Shift
等修饰键和任何字母、功能键。
// Ctrl + 某个字母
ui->buttonA->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_P)); // Ctrl+P
ui->buttonB->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_S)); // Ctrl+S
ui->buttonC->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_Q)); // Ctrl+Q// Alt + 某个字母 (常用于菜单助记符的替代)
ui->buttonD->setShortcut(QKeySequence(Qt::ALT | Qt::Key_F)); // Alt+F
ui->buttonE->setShortcut(QKeySequence(Qt::ALT | Qt::Key_E)); // Alt+E// Ctrl + Shift + 某个字母
ui->buttonF->setShortcut(QKeySequence(Qt::CTRL | Qt::SHIFT | Qt::Key_N)); // Ctrl+Shift+N// 单独的功能键 (F1-F12, 等)
ui->helpButton->setShortcut(QKeySequence(Qt::Key_F1)); // F1
ui->refreshButton->setShortcut(QKeySequence(Qt::Key_F5)); // F5
- 示例 3:使用字符串(直观,但需注意格式)
直接用字符串描述按键,非常直观,但要确保格式正确。
// 设置"上"按钮的快捷键为 W 键
ui->pushButton_up->setShortcut(QKeySequence("w"));
// 设置"下"按钮的快捷键为 S 键
ui->pushButton_down->setShortcut(QKeySequence("s"));
// 设置"左"按钮的快捷键为 A 键
ui->pushButton_left->setShortcut(QKeySequence("a"));
// 设置"右"按钮的快捷键为 D 键
ui->pushButton_right->setShortcut(QKeySequence("d"));// 基本组合键
ui->buttonG->setShortcut(QKeySequence("Ctrl+P"));
ui->buttonH->setShortcut(QKeySequence("Ctrl+S"));
ui->buttonI->setShortcut(QKeySequence("Alt+F4"));// 功能键
ui->buttonJ->setShortcut(QKeySequence("F1"));
ui->buttonK->setShortcut(QKeySequence("Space")); // 空格键
ui->buttonL->setShortcut(QKeySequence("Esc")); // 退出键// 更复杂的组合
ui->buttonM->setShortcut(QKeySequence("Ctrl+Shift+T"));
- 示例 4:清除快捷键
有时候你可能需要动态地移除一个已经设置的快捷键。
// 传入一个空的 QKeySequence 即可清除快捷键
ui->someButton->setShortcut(QKeySequence());
回到我们的项目
这就是我们的完整的代码,我们现在运行一下
在键盘上点击10下a
在键盘上面点击10次s
……反正就是能正常使用。
事实上,下面这样子设置快捷键的效果是和上面的一模一样的
比起上面那种,我更推荐使用这种,
我们可以把鼠标光标移动到这里来
按下ctrl+鼠标左键,进入下面这里
……
……
这里有很多内置好了的,我们直接使用这个即可。
1.3.示例3——按钮的重复触发
上面这个程序其实还是有一点缺陷的,就是我们用鼠标点击left按钮,不松开,但是这个target却不移动,这个是有悖于我们的直觉的吧。
也就是说在上述案例中,按住快捷键,是可以进⾏重复触发的.但是⿏标点击则不能.
其实很简单,只需要在构造函数里加上下面这个即可
setAutoRepeat
的作用是决定一个按钮(如 QPushButton
)在被用户按下并按住时,是否会自动、连续、多次地触发点击信号。
-
关闭时(默认):
-
用户按下按钮到松开之间,无论用户按了多久,只会触发一次
clicked()
之类的信号。 -
这是最普通的按钮行为。
-
-
开启时(设为
true
):-
用户只需按住按钮不松开。
-
在短暂的初始延迟后,按钮就会像被疯狂连点一样,开始持续不断地、每隔一小段时间就触发一次
clicked()
信号。 -
直到用户松开手指,重复才会停止。
-
这样子我们用鼠标按着left按钮,target就会一直往左边走。
二.QRadioButton(单选按钮)
什么是单选按钮?
像上面这样子的就是单选按钮。上面这种是只能二选一的。
QRadioButton(单选按钮)是一种允许用户从多个选项中选择其一的界面控件。
作为 QAbstractButton 和 QWidget 的子类,QRadioButton 继承了它们的属性和方法,因此之前介绍的关于 QAbstractButton 的常用属性和用法同样适用于 QRadioButton。
以下是几个与 QRadioButton 密切相关的属性:
- checkable:表示该按钮是否可被选中。只有在该属性为 True 时,用户才能选择该按钮。
- checked:表示该按钮当前是否已被选中。注意,checked 的前提是 checkable 为 True,否则无法选中。
- autoExclusive:指定是否具有自动排他性。即当选中某一个按钮时,是否自动取消同组中其他按钮的选中状态。对于 QRadioButton 来说,该属性默认为 True,这也是其作为“单选”按钮的核心行为。通常多个 QRadioButton 会默认处于同一按钮组中,实现互斥选择。
QRadioButton 通常用于一组互斥的选项,用户只能选择其中之一,常见于设置、表单或对话框中的选项切换。如果需要多个选项可同时选中,则应使用 QCheckBox(复选框)。
2.1.示例1——选择性别
我们创建一个新项目
在界⾯上拖出3个单选按钮
再创建⼀个label
它们的objectname是
接下来我们就给3个单选按钮设置槽函数
我们运行一下
我们发现它什么都没有选中,接下来我们按顺序依次点击下面这些按钮
当前代码中,如果程序启动,则不会选择任何选项。
可以修改代码,让程序启动默认选中性别男。
当前代码中,也可以禁⽤"其他"被选中.
完整代码如下
我们运行一下
点击其他按钮
发现虽然按钮没有被选中,但是我们label上面的字已经变了。这个很奇怪啊!!!
setCheckable(false)它只是阻止了按钮不能被选中,但是却又不能阻止槽函数的触发。
所以我们可以使用其他函数来禁用这个按钮
我们一运行,就是下面这个情况,任凭我们怎么点击这个其他按钮,都没有什么反应。
当然,我们还可以使用下面这种
我们一运行,就是下面这个情况,任凭我们怎么点击这个其他按钮,都没有什么反应。
2.2.示例2——click,press,release, toggled 的区别
还记得我们在qt designer里面设置槽函数的时候,经常会看到下面这些信号
那么今天我来好好讲讲下面4个的区别
- clicked表⽰⼀次"点击"
- pressed表⽰⿏标"按下"
- released表⽰⿏标"释放"
- toggled表⽰按钮状态切换.
这些信号都源于用户与鼠标(或触摸屏、键盘快捷键)的交互,但代表了交互流程中的不同阶段。
我们创建一个新项目
1) 在界⾯上创建四个单选按钮
它们的objectname是
全部给我配置一个槽函数,就按照上面的名字来
直接运行
clicked()
- 点击
-
触发时机:这是最常用、最符合直觉的信号。它在一次完整的“点击”动作完成后触发。具体来说,它需要满足下面两个条件,二者不可缺一:
-
鼠标按下 的那一瞬间,光标在按钮上。
-
鼠标释放 的那一瞬间,光标还在按钮上。
-
-
行为特点:这是一个“安全”的信号。它确保用户是“有意”点击这个按钮的(即按下和释放都在按钮上)。如果用户按下后改变主意,将鼠标拖到按钮外释放,
clicked
信号不会被触发。
我们用鼠标点击下面这个按钮,鼠标按下之后不要松开
我们把鼠标移动到按钮外进行释放,发现这个按钮没有被选中
我们看控制台
什么都没有,这就是说明了这个信号没有被触发。这就是clicked信号的特点
它需要满足下面两个条件,二者不可缺一:
-
鼠标按下 的那一瞬间,光标在按钮上。
-
鼠标释放 的那一瞬间,光标还在按钮上。
我们一点击clicked(bool)按钮
我们多次点击一下这个clicked(bool)按钮
怎么样?每点击一次就触发一次。
pressed()
- 鼠标按下
-
触发时机:当鼠标在按钮内部被按下的一瞬间立即触发。
-
行为特点:这是一个“即时”信号。它不关心鼠标按键之后是否会被释放,甚至不关心鼠标是否还在按钮上。只要按下动作发生,信号就发出。
我们用鼠标点击下面这个按钮,鼠标按下之后不要松开
我们把鼠标移动到按钮外进行释放,发现这个按钮没有被选中
但是我们看控制台
这个信号还是被触发了。
当然,我们多次点击,也会触发这个press信号
toggled(bool)
- 状态切换
-
触发时机:当按钮的状态发生改变时触发。这个信号是可切换按钮(如
QPushButton
设置为setCheckable(true)
、QRadioButton
、QCheckBox
)特有的。 -
行为特点:
-
它带有一个
bool
参数,表示按钮的新状态(true
表示选中/开,false
表示未选中/关)。 -
它的触发是状态驱动的,而不是直接由一次点击驱动。一次点击可能会引起状态变化,从而触发
toggled
。但如果通过代码(例如setChecked(true)
)改变状态,同样会触发toggled
信号。 -
一个可切换按钮被点击时,会同时发射
clicked()
和toggled(bool)
两个信号。
-
我们点击这个toggled(bool)
我们再次点击这个toggled(bool)
发现没有任何反应,现在我们点击这个pressed按钮
就会发现
也就是说这个信号只有当按钮的状态发生改变时触发。
released()
- 鼠标释放
-
触发时机:当按下的鼠标按键被释放时触发。
-
行为特点:它通常与
pressed
配对使用。但有一个关键点:鼠标的释放位置会影响此信号。如果用户在按钮上按下鼠标,然后将鼠标拖到按钮区域外再释放,released
信号依然会发出,但通常不会触发clicked
信号。
我们点击这个按钮
一直按住,不移动光标的话,released信号不会被触发,可当我们把鼠标一移动开这个按钮的话,就触发了这个信号
2.3.示例3——单选框分组
我们创建一个新的项目
在界⾯上创建6个单选框,⽤来模拟⻨当劳点餐界⾯.
接下来我们来3个label
现在这些objectname是
- redioButton,redioButton_2对应鸡腿堡和牛肉堡
- redioButton_3,redioButton_4对应薯条和鸡翅
- redioButton_5,redioButton_6对应可乐和雪碧
我们运行一下,我们先选择鸡腿堡
现在我们来选薯条
却发现我刚刚选的鸡腿堡却消失了。这其实是这六个 QRadioButton 之间都是排他的.
我们希望每⼀组内部来控制排他,但是组和组之间不能排他.
引⼊QButtonGroup进⾏分组
我们运行一下,发现组和组之间是没有排他的机制了。
现在我们点击牛肉堡
我们发现鸡腿堡被自动取消了。
当然其他组也是如此
三.QCheckBox(多选按钮)
什么是多选按钮,大家看看下面这个就明白了
QCheckBox 表⽰复选按钮.可以允许选中多个.
它相关的属性如下
- checkable:表示该按钮是否可被选中。只有在该属性为 True 时,用户才能选择该按钮。
- checked:表示该按钮当前是否已被选中。注意,checked 的前提是 checkable 为 True,否则无法选中。
我们创建一个新例子
它们的objectname是
接下来我们给确认按钮配置一个槽函数
我们直接运行
点击确认
选择打印
点击确认
再选择游泳
点击确认
再选择睡觉
点击确认