8.QT-按钮类控件|Push Button|Radio Button|Check Box|Tool Button(C++)

news2025/4/22 3:47:56

Push Button

使⽤ QPushButton 表⽰⼀个按钮.这也是当前我们最熟悉的⼀个控件了.
QPushButton 继承⾃ QAbstractButton .这个类是⼀个抽象类.是其他按钮的⽗类

![[Pasted image 20250419191533.png]]

在Qt Designer中也能够看到这⾥的继承关系

属性说明
text按钮中的⽂本
icon按钮中的图标
iconSize按钮中图标的尺⼨
shortCut按钮对应的快捷键
autoRepeat按钮是否会重复触发.当⿏标左键按住不放时,
如果设为true,则会持续产⽣⿏标点击事件;
如果设为false,则必须释放⿏标,再次按下⿏标时才能产⽣点击事件.
(相当于游戏⼿柄上的"连发"效果)
autoRepeatDelay重复触发的延时时间.按住按钮多久之后,开始重复触发.
autoRepeatInterval重复触发的周期.
  1. QAbstractButton 作为 QWidget 的⼦类,当然也继承了 QWidget 的属性.上⾯介绍的 QWidget ⾥的各种属性⽤法,对于 QAbstractButton 同样适⽤.因此表格仅
    列出 QAbstractButton 独有的属性.
  2. Qt的api设计⻛格是⾮常清晰的.此处列出的属性都是可以 获取 和 设置 的.例如,使⽤ text() 获取按钮⽂本;使⽤ setText() 设置⽂本.
    事实上, QPushButton 的核⼼功能都是 QAbstractButton 提供的.⾃⾝提供的属性都⽐较简单.
    其中 default 和 audoDefault 影响的是按下enter时⾃动点击哪个按钮的⾏为; flat 把按钮设置为扁平的样式.这⾥我们暂时都不做过多关注.
代码⽰例:带有图标的按钮

1)创建 resource.qrc ⽂件,并导⼊图⽚
![[Pasted image 20250419205021.png]]

2)在界⾯上创建⼀个按钮
![[Pasted image 20250419205128.png]]

3)修改widget.cpp,给按钮设置图标

#include "widget.h"
#include "ui_widget.h"
  
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //创建图标对象
    QIcon icon(":/dog.jpg");
    //设置图标
    ui->pushButton->setIcon(icon);
}
  
Widget::~Widget()
{
    delete ui;
}

![[Pasted image 20250419205838.png]]

#include "widget.h"
#include "ui_widget.h"
  
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
  
    //创建图标对象
    QIcon icon(":/dog.jpg");
    //设置图标
    ui->pushButton->setIcon(icon);
    //设置图标尺寸
    ui->pushButton->setIconSize(QSize(50, 50));
}
  
Widget::~Widget()
{
    delete ui;
}

![[Pasted image 20250419210014.png]]

代码⽰例:带有快捷键的按钮

1)在界⾯中拖五个按钮.
五个按钮的objectName分别为 pushButton_target , pushButton_up ,pushButton_down ,pushButton_left , pushButton_right 五个按钮的初始位置随意,其中 pushButton_target 尺⼨设置为100*100,其余按钮设为50*50.⽂本内容均清空
2)创建 resource.qrc ,并导⼊5个图⽚
![[Pasted image 20250419211936.png]]

3)修改widget.cpp,设置图标资源和快捷键

  • 使⽤ setShortcut 给按钮设置快捷键.参数是⼀个QKeySequence对象.表⽰⼀个按键序列.⽀持组合键(ctrl+c这种).
  • QKeySequence的构造函数参数,可以直接使⽤"ctrl+c"这样的按键名字符串表⽰,也可以使⽤预定义好的常量(形如 Qt::CTRL + Qt::Key_C )表⽰.
    ![[Pasted image 20250419212257.png]]

![[Pasted image 20250419212400.png]]

完成初始化

#include "widget.h"
#include "ui_widget.h"
  
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
  
    //设置图标
    ui->pushButton_target->setIcon(QIcon(":/image/box.png"));
    ui->pushButton_target->setIconSize(QSize(100,100));
  
    ui->pushButton_up->setIcon(QIcon(":/image/up.png"));
    ui->pushButton_up->setIconSize(QSize(50,50));
  
    ui->pushButton_down->setIcon(QIcon(":image/down.png"));
    ui->pushButton_down->setIconSize(QSize(50,50));
  
    ui->pushButton_left->setIcon(QIcon(":image/left.png"));
    ui->pushButton_left->setIconSize(QSize(50,50));
  
    ui->pushButton_right->setIcon(QIcon(":image/right.png"));
    ui->pushButton_right->setIconSize(QSize(50,50));
}
  
Widget::~Widget()
{
    delete ui;
}

![[Pasted image 20250419213210.png]]

完成槽函数

void Widget::on_pushButton_up_clicked()
{
    //获取target的位置
    QRect rect = ui->pushButton_target->geometry();
    //基于上次的位置,设置新的位置
    ui->pushButton_target->setGeometry(rect.x(), rect.y()-5, rect.width(), rect.height());
}
  
void Widget::on_pushButton_down_clicked()
{
    //获取target的位置
    QRect rect = ui->pushButton_target->geometry();
    //基于上次的位置,设置新的位置
    ui->pushButton_target->setGeometry(rect.x(), rect.y()+5, rect.width(), rect.height());
}
  
void Widget::on_pushButton_left_clicked()
{
    //获取target的位置
    QRect rect = ui->pushButton_target->geometry();
    //基于上次的位置,设置新的位置
    ui->pushButton_target->setGeometry(rect.x()-5, rect.y(), rect.width(), rect.height());
}
  
void Widget::on_pushButton_right_clicked()
{
    //获取target的位置
    QRect rect = ui->pushButton_target->geometry();
    //基于上次的位置,设置新的位置
    ui->pushButton_target->setGeometry(rect.x()+5, rect.y(), rect.width(), rect.height());
}

在构造函数完成快捷键

    ui->pushButton_up->setShortcut(QKeySequence("w"));
    ui->pushButton_down->setShortcut(QKeySequence("s"));
    ui->pushButton_left->setShortcut(QKeySequence("a"));
    ui->pushButton_right->setShortcut(QKeySequence("d"));
    
// ui->pushButton_up->setShortcut(QKeySequence(Qt::Key_W));  
// ui->pushButton_down->setShortcut(QKeySequence(Qt::Key_S));  
// ui->pushButton_left->setShortcut(QKeySequence(Qt::Key_A));  
// ui->pushButton_right->setShortcut(QKeySequence(Qt::Key_D));
代码⽰例:按钮的重复触发

在上述案例中,按住快捷键,是可以进⾏重复触发的.但是⿏标点击则不能.
修改widget.cpp,在构造函数中开启重复触发
在构造函数中

    ui->pushButton_up->setAutoRepeat(true);
    ui->pushButton_down->setAutoRepeat(true);
    ui->pushButton_left->setAutoRepeat(true);
    ui->pushButton_right->setAutoRepeat(true);

Radio Buttion

QRadioButton 是单选按钮.可以让我们在多个选项中选择⼀个.
作为 QAbstractButton 和 QWidget 的⼦类,上⾯介绍的属性和⽤法,对于 QRadioButton 同样适⽤.
QAbstractButton 中和 QRadioButton 关系较⼤的属性

属性说明
checkable是否能选中
checked是否已经被选中.checkable是checked的前提条件.
autoExclusive是否排他.
选中⼀个按钮之后是否会取消其他按钮的选中.
对于 QRadioButton 来说默认就是排他的
代码⽰例:选择性别

1)在界⾯上创建⼀个label,和3个单选按钮
设置的⽂本如下图.3个单选按钮的 objectName 分别为 radioButton_male ,radioButton_female , radioButton_other
![[Pasted image 20250419220147.png]]

编写槽函数

void Widget::on_radioButton_male_clicked()
{
    //把界面上的label的内容进行更新
    ui->label->setText("你选择的性别为:男");
}
  
void Widget::on_radioButton_female_clicked()
{
    ui->label->setText("你选择的性别为:女");
}
  
void Widget::on_radioButton_other_clicked()
{
    ui->label->setText("你选择的性别为:其他");
}

![[Pasted image 20250419220411.png]]

在构造函数添加默认选项

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //添加一个默认的选项
    ui->radioButton_male->setChecked(true);
    ui->label->setText("你选择的性别为:男");
}

禁用其他选项

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
  
    //添加一个默认的选项
    ui->radioButton_male->setChecked(true);
    ui->label->setText("你选择的性别为:男");
    //禁用其他选项
    ui->radioButton_other->setCheckable(false);
}

![[Pasted image 20250419221123.png]]

checkable只是能够让按钮不被选中,仍然是可以响应点击事件的

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
  
    //添加一个默认的选项
    ui->radioButton_male->setChecked(true);
    ui->label->setText("你选择的性别为:男");
    //禁用其他选项
    //ui->radioButton_other->setCheckable(false);
    ui->radioButton_other->setEnabled(false);
    //ui->radioButton_other->setDisabled(true);
}

要使用Widget的属性
![[Pasted image 20250419221409.png]]

代码⽰例:click,press,release,toggled的区别
  • clicked表⽰⼀次"点击"
  • pressed表⽰⿏标"按下"
  • released表⽰⿏标"释放"
  • toggled表⽰按钮状态切换.
    1)在界⾯上创建四个单选按钮
    objectName 分别为 radioButton , radioButton_2 , radioButton_3 ,radioButton_4
    ![[Pasted image 20250419221819.png]]

2)给 1 创建 clicked 槽函数,给 2 创建 pressed 槽函数,给 3 创建released 槽函数,给 4 创建 toggled 槽函数.

void Widget::on_radioButton_clicked(bool checked)
{
    // 此处从 checked 就表示了当前 radioButton 的选中状态
    qDebug() << "clicked: " << checked;
}
  
void Widget::on_radioButton_2_pressed()
{
    qDebug() << "pressed";
}
  
void Widget::on_radioButton_3_released()
{
    qDebug() << "released";
}
  
void Widget::on_radioButton_4_toggled(bool checked)
{
    //如果当前checked状态发生改变,就会触发这个信号
    qDebug() << "toggled: " << checked;
}

![[Pasted image 20250419222518.png]]

3)运⾏程序,可以看到

  • clicked 是⼀次⿏标按下+⿏标释放触发的.
  • pressed 是⿏标按下触发的.
  • released 是⿏标释放触发的.
  • toggled 是checked属性改变时触发的.
    总的来说,toggled是最适合 QRadioButton 的
代码⽰例:单选框分组

1)在界⾯上创建6个单选框,⽤来模拟⻨当劳点餐界⾯.
objectName 分别为 radioButton 到 radioButton_6
![[Pasted image 20250420085424.png]]

此时直接运⾏程序,可以看到,这六个 QRadioButton 之间都是排他的.
我们希望每⼀组内部来控制排他,但是组和组之间不能排他.
2)引⼊QButtonGroup进⾏分组.

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
  
    //使用QButtonGroup对单选按钮进行分组
    QButtonGroup* group1 = new QButtonGroup(this);
    QButtonGroup* group2 = new QButtonGroup(this);
    QButtonGroup* group3 = new QButtonGroup(this);
  
    //把上述单选按钮,放到不同的组里
    group1->addButton(ui->radioButton);
    group1->addButton(ui->radioButton_2);
    group1->addButton(ui->radioButton_3);
    group2->addButton(ui->radioButton_4);
    group2->addButton(ui->radioButton_5);
    group2->addButton(ui->radioButton_6);
    group3->addButton(ui->radioButton_7);
    group3->addButton(ui->radioButton_8);
}

再次执⾏程序,可以看到可以按照正确的分组⽅式来完成排他了
![[Pasted image 20250420090358.png]]

Check Box

QCheckBox 表⽰复选按钮.可以允许选中多个.和 QCheckBox 最相关的属性也是 checkable 和 checked ,都是继承⾃QAbstractButton .
⾄于 QCheckBox 独有的属性 tristate ⽤来实现"三态复选框".这个东西⽐较冷⻔,

代码⽰例:获取复选按钮的取值

1)在界⾯上创建三个复选按钮,和⼀个普通按钮.
![[Pasted image 20250420091312.png]]

2)给 pushButton 添加slot函数

void Widget::on_pushButton_clicked()
{
    QString result = "今天的安排是";
    if (ui->checkBox_study->isChecked()){
        result += ui->checkBox_study->text();
    }
    if (ui->checkBox_game->isChecked()){
        result += ui->checkBox_game->text();
    }
    if (ui->checkBox_work->isChecked()){
        result += ui->checkBox_work->text();
    }
    ui->label->setText(result);
}

3)运⾏程序,可以看到点击确认按钮时,就会在控制台中输出选中的内容
![[Pasted image 20250420091809.png]]

Tool Button

QToolButton 的⼤部分功能,和 QPushButton 是⼀致的.但是 QToolButton 主要应⽤在⼯具栏,菜单等场景

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2339819.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32嵌入式

一、创建工程项目 1、进入软件首页 2、新建项目,【file】->【new project】 3、选择需要的芯片 4、系统内核部分设置 ① 选择晶振&#xff08;使用外部的高速晶振&#xff09; ② 选择debug形式&#xff08;SW类型&#xff09; 5、时钟设置 6、选择自己需要的引脚设置&a…

Transformer系列(一):NLP中放弃使用循环神经网络架构

NLP中放弃使用循环神经网络架构 一、符号表示与概念基础二、循环神经网络1. 依赖序列索引存在的并行计算问题2. 线性交互距离 三、总结 该系列笔记阐述了自然语言处理&#xff08;NLP&#xff09;中不再采用循环架构&#xff08;recurrent architectures&#xff09;的原因&…

9.QT-显示类控件|Label|显示不同格式的文本|显示图片|文本对齐|自动换行|缩进|边距|设置伙伴(C++)

Label QLabel 可以⽤来显⽰⽂本和图⽚ 属性说明textQLabel中的⽂本textFormat⽂本的格式.• Qt::PlainText 纯⽂本• Qt::RichText 富⽂本(⽀持html标签)• Qt::MarkdownText markdown格式• Qt::AutoText 根据⽂本内容⾃动决定⽂本格式pixmapQLabel 内部包含的图⽚.scaledCo…

【c语言】深入理解指针1

深入理解指针1 一、数组名的理解二、使用指针访问数组三、一维数组传参本质四、二级指针 一、数组名的理解 数组名就是数组首元素的地址&#xff0c;类型是指针类型&#xff0c;但是存在两个例外&#xff1a; sizeof(arr) : 整个数组在内存中的大小 &arr : 整个数组的地址…

4.QT-信号和槽|存在意义|信号和槽的连接方式|信号和槽断开|lambda表达式|信号和槽优缺点(C++)

信号和槽存在意义 所谓的信号槽&#xff0c;终究要解决的问题&#xff0c;就是响应用户的操作 信号槽&#xff0c;其实在GUI开发的各种框架中&#xff0c;是一个比较有特色的存在 其他的GUI开发框架&#xff0c;搞的方式都要更简洁一些&#xff5e;~ 网页开发 (js dom api) 网…

单元测试的一般步骤

Qt Test Qt Test 是 Qt 开发人员发布的一个单元测试框架&#xff0c;用于测试基于 Qt 框架的应用程序或库。它提供了单元测试框架中常见的所有功能以及用于测试图形用户界面的扩展。 1.自动化测试包络ui测试>接口测试>单元测试&#xff1b;现问如何使用Qt进行单元测试&…

UE5 渲染视频

文章目录 概述插件开始渲染渲染透明背景的视频 概述 渲染视频需要使用关卡序列 渲染原理就是将一个关卡序列渲染为序列帧 序列帧放到AE里会自动变成视频 UE版本是5.4.4 插件 首先开启新的渲染插件&#xff0c;否则会自动使用旧的渲染插件 插件里搜Render&#xff0c;开启这…

pycharm无法识别到本地python的conda环境解决方法

问题一 现象描述&#xff1a; 本地已经安装了conda&#xff0c;但在pycharm中选择conda环境却识别不到&#xff0c; 解决方法&#xff1a;手动输入conda path&#xff0c;点击R eload environments基本就能修复&#xff0c;比如我的路径如下 /Users/test/conda/miniconda3/b…

LFM调制信号分类与检测识别

LFM调制信号分类与检测识别 LFM调制信号分类识别AlexNet网络识别InceptionV3、ResNet-18、ResNet-50网络识别 LFM调制信号检测识别 LFM调制信号分类识别 支持识别LFM信号、间歇采样干扰(ISRJ)、灵巧噪声干扰(SNJ)、扫频干扰(SJ)、瞄准干扰(AJ)、阻塞干扰(BJ)、密集假目标干扰(…

头歌实训之连接查询

&#x1f31f; 各位看官好&#xff0c;我是maomi_9526&#xff01; &#x1f30d; 种一棵树最好是十年前&#xff0c;其次是现在&#xff01; &#x1f680; 今天来学习C语言的相关知识。 &#x1f44d; 如果觉得这篇文章有帮助&#xff0c;欢迎您一键三连&#xff0c;分享给更…

常见的服务器硬盘接口

常见的服务器硬盘接口有SATA、SAS、M.2、U.2 一、SATA接口 SATA&#xff08;Serial Advanced Technology Attachment&#xff09;是广泛应用于存储设备的串行接口标准&#xff0c;在服务器中主要用于连接大容量机械硬盘&#xff08;HDD&#xff09;或经济型固态硬盘&#xff…

SpringBoot编写单元测试

pom.xml引入单元测试的坐标 <!--单元测试坐标--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>编写单元测试类 测试类…

目标分割模型优化自身参数都是梯度下降算法吗?

在计算机视觉的深度学习任务中&#xff0c;诸如 CNN、FCN、U-Net、DeepLab 系列模型已成为图像分类与图像分割任务的核心架构。它们在网络结构和任务上有所差异&#xff0c;但是否共享同一种优化机制&#xff1f;是否都使用梯度下降&#xff1f;优化过程中又有什么本质区别&…

基于springboot的商城

1 项目使用技术 后端框架&#xff1a;SpringBoot 数据库&#xff1a;MySQL 开发工具&#xff1a;IDEA 2 项目功能模块 商城功能包含前台和后台。 &#xff08;1&#xff09;前台主要包含&#xff1a;用户注册登录模块、首页模块、搜索模块、商品详情、购物车、提交订单、…

MATLAB 控制系统设计与仿真 - 37

范数鲁棒控制器的设计 鲁棒控制器的设计 根据双端子状态方程对象模型结构&#xff0c;控制器设计的目标是找到一个控制器K(s),它能保证闭环系统的范数限制在一个给定的小整数下&#xff0c;即 这时控制器的状态方程为&#xff1a; 其中X与Y分别为下面两个代数Riccati方程的解…

英码科技与泊川软件,携手加速AI与嵌入式系统融合创新

2025年4月15日&#xff0c;广州英码信息科技有限公司&#xff08;以下简称“英码科技”&#xff09;与广州泊川软件技术有限公司&#xff08;以下简称“泊川软件”&#xff09; 正式签署战略合作框架协议。此次合作将充分发挥双方在AI计算硬件与嵌入式操作系统领域的技术优势&a…

电脑 访问 github提示 找不到网页,处理方案

1、找到 本机的 host文件 例如 windows 的 一般在 C:\Windows\System32\drivers\etc\hosts 用管理员身份打开 hosts 文件 如果文件中没有 github的配置&#xff0c;需要自己手动添加上去&#xff1b; 如果有&#xff0c;则需要 检查 github.com 与 github.global.ssl.fastly.…

Linux学习——了解和熟悉Linux系统的远程终端登录

Linux学习——了解和熟悉Linux系统的远程终端登录 一.配置Ubuntu系统的网络和用户 1、设置虚拟机网络为桥接模式 打开VMWare&#xff0c;选择编辑虚拟机设置&#xff0c;在网络适配器设置中&#xff0c;选择“桥接模式”&#xff0c;保存设置并启动Ubuntu。 2、配置Ubuntu的…

AI 中的 CoT 是什么?一文详解思维链

文章目录 CoT 的组成CoT 的作用CoT 的推理结构变体CoT 的特点CoT 的适用场景总结 在人工智能领域&#xff0c;尤其是自然语言处理和机器学习中&#xff0c;有一种名为思维链&#xff08;Chain of Thought&#xff0c;CoT&#xff09;的技术&#xff0c;它正逐渐改变着我们对 AI…

【OC】AVPlayerLayer的学习

文章目录 前言关于AVPlayer概念及作用具体方法及使用 关于AVPlayerLayer基本概念及作用具体用法 AVPlayer与AVPlayerLayer结合实现视频播放应用使用本地视频使用网络请求申请视频数据 总结 前言 在编写类视频软件项目时&#xff0c;涉及到视频播放的问题&#xff0c;我们需要给…