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

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 主要应⽤在⼯具栏,菜单等场景

<think>首先,用户的问题是:"Push ButtonTool Button 以及Dialog Button Box怎么理解,区别是什么?" 我需要用中文回答。 我的回答必须包括: 1.Push ButtonTool Button和Dialog Button Box的解释。 2. 它们之间的区别。 3. 回答完问题后,在末尾输出"§§相关问题§§",然后列出3-5个相关问题。 4. "§§相关问题§§"必须完整输出在第一行,禁止换行分散。 问题涉及Qt框架中的控件- Push Button:通常是一个标准按钮,用于触发动作。 - Tool Button:常用于工具栏,可以有图标或文本,支持下拉菜单。 - Dialog Button Box:用于对话框中的按钮布局,如OK、Cancel等,提供标准按钮。 关键点: - **Push Button**:是QPushButton类,用于通用按钮操作。 - **Tool Button**:是QToolButton类,通常用于工具栏,支持图标、工具提示、下拉菜单。 - **Dialog Button Box**:是QDialogButtonBox类,用于管理对话框中的标准按钮,如Accept、Reject、Help等,自动处理布局和信号。 区别: - **用途**:Push Button通用;Tool Button用于工具栏;Dialog Button Box用于对话框按钮组。 - **功能**:Push Button基本动作;Tool Button可能有菜单;Dialog Button Box管理标准按钮。 - **布局**:Dialog Button Box自动布局按钮。 回答结构: 1. 先解释每个控件。 2. 然后比较区别。 3. 提供简单代码示例(如果合适)。 4. 最后输出"§§相关问题§§"和相关问题。 相关问题:基于用户的问题和我的回答,提出3-5个问题。例如: - 如何自定义Push Button的样式? - Tool Button的下拉菜单如何实现? - Dialog Button Box中如何添加自定义按钮? -Qt中,如何连接这些按钮的信号? - 这些按钮在跨平台上的行为有什么不同? 确保相关问题: - 与主题相关。 - 数量在3-5个。 - 以列表形式输出。 完整回答格式: - 回答内容。 - "§§相关问题§§" - 1. 问题1 - 2. 问题2 - 3. 问题3 现在,撰写回答。</think>在Qt框架中,**Push Button(按钮)**、**Tool Button(工具按钮)** 和**Dialog Button Box(对话框按钮盒)** 都是用于用户交互的核心控件,但它们在设计目的、功能和使用场景上有显著区别。以下是详细解析: --- ### 1. **Push Button (QPushButton)** - **核心理解**:标准按钮控件,用于触发一次性动作(如确认、取消)。支持文本、图标或两者结合。 - **典型用途**: - 表单提交(如登录按钮) - 通用命令执行(如“保存”按钮) - **关键特性**: - 默认样式:矩形外观,可设置悬停/按下效果。 - 支持信号(如`clicked()`)连接槽函数。 - 可定义快捷键(如`Alt+S`)。 - **代码示例**: ```cpp QPushButton *button = new QPushButton("保存"); connect(button, &QPushButton::clicked, this, &MyClass::saveData); ``` --- ### 2. **Tool Button (QToolButton)** - **核心理解**:专为工具栏设计的按钮,通常用于频繁操作(如复制、粘贴),支持下拉菜单。 - **典型用途**: - 工具栏图标按钮(如文本编辑器的“加粗”按钮) - 下拉菜单入口(如“更多操作”按钮) - **关键特性**: - 默认样式:紧凑设计(常仅显示图标),可集成到`QToolBar`。 - 支持菜单弹出(通过`setMenu()`设置)。 - 可配置弹出模式(如`QToolButton::MenuButtonPopup`)。 - **与Push Button区别**: - 更轻量级,适合工具栏空间。 - 内置菜单支持,Push Button需手动实现。 - **代码示例**: ```cpp QToolButton *toolBtn = new QToolButton; toolBtn->setIcon(QIcon(":/icons/cut.png")); QMenu *menu = new QMenu; menu->addAction("高级选项"); toolBtn->setMenu(menu); ``` --- ### 3. **Dialog Button Box (QDialogButtonBox)** - **核心理解**:容器控件,用于标准化管理对话框按钮(如OK/Cancel),自动处理布局和信号。 - **典型用途**: - 对话框底部按钮区(如文件保存确认) - 标准按钮组(遵循平台规范) - **关键特性**: - 预定义按钮角色:`Accept`(OK)、`Reject`(Cancel)、`Help`等。 - 自动适应平台样式(Windows/macOS/Linux按钮顺序不同)。 - 统一信号(如`accepted()`、`rejected()`)。 - **与Push/Tool Button区别**: - 非单一按钮,而是按钮组管理器。 - 自动布局,避免手动排列按钮。 - 内置标准按钮逻辑,减少重复代码。 - **代码示例**: ```cpp QDialogButtonBox *buttonBox = new QDialogButtonBox; buttonBox->addButton(QDialogButtonBox::Ok); buttonBox->addButton(QDialogButtonBox::Cancel); connect(buttonBox, &QDialogButtonBox::accepted, this, &MyDialog::accept); ``` --- ### 三者的核心区别总结 | 特性 | Push Button (QPushButton) | Tool Button (QToolButton) | Dialog Button Box (QDialogButtonBox) | |---------------------|--------------------------------|----------------------------------|--------------------------------------| | **主要用途** | 通用动作触发(如提交表单) | 工具栏操作(常带图标/菜单) | 对话框标准按钮组(如OK/Cancel) | | **容器性质** | 独立控件 | 独立控件 | 按钮容器(管理多个按钮) | | **菜单支持** | 需手动实现 | 原生支持下拉菜单 | 不支持(仅管理按钮) | | **布局管理** | 需手动定位 | 需手动定位 | 自动布局(跨平台自适应) | | **平台适配** | 基础样式一致 | 基础样式一致 | 自动调整按钮顺序和样式 | | **典型场景** | 窗口中的普通按钮 | 工具栏、工具箱 | 对话框底部按钮区 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值