当前位置: 首页 > news >正文

【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 中常用属性的表格说明:

属性类型说明
textQString按钮上显示的文本内容
iconQIcon按钮上显示的图标
iconSizeQSize按钮上图标的尺寸
shortcutQKeySequence按钮对应的键盘快捷键
autoRepeatbool是否启用自动重复触发功能
当鼠标左键按住不放时:
- true: 持续产生点击事件(类似游戏手柄的"连发"效果)
- false: 必须释放鼠标再次按下才能产生点击事件
autoRepeatDelayint自动重复触发的延时时间(毫秒)
按住按钮多久之后开始重复触发
autoRepeatIntervalint自动重复触发的周期(毫秒)
开始重复触发后,每次触发的时间间隔

1.1.示例1——带有图标的按钮

我们创建一个新项目

首先我们先去网上找一个图片,作为按钮的图标

如果大家不知道该去哪里寻找图片,我给大家推荐一个网址:iconfont-阿里巴巴矢量图标库

接着我们创建一下qrc文件

注意这里不能带中文

点击完成

注意:我们需要提取将图片资源放置到我们qrc文件所在目录或者其子目录里面

添加成功

他的objectname是pushButton

怎么样??还是很不错的吧!!

当然,如果你觉得太小,也可以进行调整

还不错吧。

1.2.示例2——带快捷键的按钮

我们之前写过一个例子,控制target按钮的移动,之前是通过鼠标点击按钮来实现的。

此处我们可以引入快捷键来操作,也就是通过按键盘来实现target按钮的移动

我们创建一个新的项目

首先我们需要准备一些图片,大家可以去:iconfont-阿里巴巴矢量图标库

接下来我们创建一个qrc文件

 接着我们创建一下qrc文件

现在我们把他们全部复制到我们的qrc文件

注意我们需要提取把资源拷贝到这个qrc文件所在目录或者其子目录

全部添加进来。现在qrc文件就创建好了。

接下来我们来创建一下我们的项目

五个按钮的objectName分别为

  1. pushButton_target 
  2.  pushButton_down 
  3.  pushButton_up 
  4.  pushButton_left 
  5.  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:使用组合键(修饰键 + 键位)

这是最灵活的方式,你可以自由组合 CtrlAltShift 等修饰键和任何字母、功能键。

// 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)在被用户按下并按住时,是否会自动、连续、多次地触发点击信号。

  1. 关闭时(默认)

    • 用户按下按钮到松开之间,无论用户按了多久,只会触发一次 clicked() 之类的信号。

    • 这是最普通的按钮行为。

  2. 开启时(设为 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个的区别

  1. clicked表⽰⼀次"点击"
  2. pressed表⽰⿏标"按下" 
  3. released表⽰⿏标"释放"
  4. toggled表⽰按钮状态切换.

这些信号都源于用户与鼠标(或触摸屏、键盘快捷键)的交互,但代表了交互流程中的不同阶段。

我们创建一个新项目

1) 在界⾯上创建四个单选按钮

它们的objectname是

全部给我配置一个槽函数,就按照上面的名字来

直接运行


clicked() - 点击

  • 触发时机:这是最常用、最符合直觉的信号。它在一次完整的“点击”动作完成后触发。具体来说,它需要满足下面两个条件,二者不可缺一:

    1. 鼠标按下 的那一瞬间,光标在按钮上

    2. 鼠标释放 的那一瞬间,光标还在按钮上。

  • 行为特点:这是一个“安全”的信号。它确保用户是“有意”点击这个按钮的(即按下和释放都在按钮上)。如果用户按下后改变主意,将鼠标拖到按钮外释放,clicked 信号不会被触发。

我们用鼠标点击下面这个按钮,鼠标按下之后不要松开

我们把鼠标移动到按钮外进行释放,发现这个按钮没有被选中

我们看控制台

什么都没有,这就是说明了这个信号没有被触发。这就是clicked信号的特点

它需要满足下面两个条件,二者不可缺一:

  1. 鼠标按下 的那一瞬间,光标在按钮上

  2. 鼠标释放 的那一瞬间,光标还在按钮上。

我们一点击clicked(bool)按钮

我们多次点击一下这个clicked(bool)按钮

怎么样?每点击一次就触发一次。


pressed() - 鼠标按下

  • 触发时机:当鼠标在按钮内部被按下的一瞬间立即触发。

  • 行为特点:这是一个“即时”信号。它不关心鼠标按键之后是否会被释放,甚至不关心鼠标是否还在按钮上。只要按下动作发生,信号就发出。

我们用鼠标点击下面这个按钮,鼠标按下之后不要松开

我们把鼠标移动到按钮外进行释放,发现这个按钮没有被选中

但是我们看控制台

这个信号还是被触发了。

当然,我们多次点击,也会触发这个press信号

toggled(bool) - 状态切换

  • 触发时机:当按钮的状态发生改变时触发。这个信号是可切换按钮(如 QPushButton 设置为 setCheckable(true)QRadioButtonQCheckBox)特有的。

  • 行为特点

    • 它带有一个 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是

接下来我们给确认按钮配置一个槽函数

我们直接运行

点击确认

选择打印

点击确认

再选择游泳

点击确认

再选择睡觉

点击确认

http://www.dtcms.com/a/397967.html

相关文章:

  • 编程与数学 03-009 Linux 操作系统应用 19_Linux 系统性能监控
  • MQTT通信实现方案(Spring Boot 3 集成MQTT)
  • 做网站客户需求网站建设与运行的盈利收入
  • Sass:CSS 预处理器
  • CSS元素的总宽度计算规则
  • WPS表格和Excel中快速选择有批注的全部单元格
  • 108. 将有序数组转换为二叉搜索树【 力扣(LeetCode) 】
  • 构建你的 MCP 能力层:.NET 9 + SK 的系统方案
  • 好网站分享建设一个网站的具体流程
  • 缓存优化技术指南:让数据访问快如闪电
  • 算法相关问题记录
  • DV OV EV SSL证书验证级别
  • 中山做网站哪家公司好网页设计模板html图片
  • AI赋能 破局重生 嬗变图强 | 安贝斯受邀参加2025第三届智能物联网与安全科技应用大会暨第七届智能化信息化年度峰会
  • ASP.NET 学习总结
  • 基于ASP.NET+SQL Server简单的 MVC 电商网站
  • 开源生态与技术民主化 - 从LLaMA到DeepSeek的开源革命(LLaMA、DeepSeek-V3、Mistral 7B)
  • 电路方案分析(二十三)Hi-Fi耳机放大器电源参考设计
  • 快速识别可访问端口号:Python 实现端口扫描
  • 【汽车篇】AI深度学习在汽车激光焊接外观检测的应用
  • 广州专业建站旅游景区网站建设规划
  • 【第30话:路径规划】自动驾驶中Hybrid A星(A*)搜索算法的详细推导及代码示例
  • [算法导论] 正则匹配 . *
  • 电子商务网站开发教程网站源码.net
  • (三)React+.Net+Typescript全栈(动态Router/Redux/RTK Query获取后端数据)
  • elasticsearch的使用、api调用、更新、持久化
  • Jenkins(速通版)
  • IDEA新建SpringBoot项目时没有低版本Java选项
  • Jupyter Lab 汉化
  • Amazon Chime SDK 详解:AWS 的实时音视频利器