【Qt】常用控件----按钮类控件

目录

前言

书接上文【Qt】常用控件----QWidget详情请点击查看,今天继续来介绍【Qt】常用控件----按钮类控件(按钮类控件都是继承自QWidget,QWidget涉及的属性、函数、使用方法,在下面介绍的控件中,都是能够使用的

  • QToolButton 的大部分功能和QPushButton是一致的。但是QToolButton 主要应用在工具栏、菜单等场景,这里先不做介绍

一、Push Button

  • QPushButton 继承自QAbstractButton ,这个类是一个抽象类----是其他按钮的父类
  • QPushButton 的核心功能都是QAbstractButton提供的,这里介绍在QAbstractButton中和QPushButton相关性较大的属性
属性 说明
text 按钮中的文本
icon 按钮中的图标
iconSize 按钮中图标尺寸
shortCut 按钮对应的快捷键
autoRepeat 按钮是否会重复触发。当鼠标左键按住不放时,如果设为true,则会持续产生鼠标点击事件;如果设为false,则必须释放鼠标,再次按下鼠标时才能产生点击事件。(相当于游戏手柄上的"连发"效果)
autoRepeatDelay 重复触发的延时时间,按住多久之后才开始重复触发
autoRepeatInterval 重复触发的周期
  • Qt的api设计风格是非常清晰,此处列出的属性都是可以获取和设置的。例如:使用text() 获取按钮文本;使用setText() 设置文本

QPushButton添加图标(icon、iconSize)

  • 创建resource.qrc 文件,并导入图片(具体操作步骤参考QWidget中的windowIcon 部分)
  • 在界面上创建一个按钮,并设置图片(使用setIcon)
cpp 复制代码
    QIcon icon(":/Qt.png");
    ui->pushButton->setIcon(icon);
  • 同时还可以使用setIconSize设置图标尺寸
cpp 复制代码
ui->pushButton->setIconSize(QSize(50, 50));

带有快捷键的按钮

  • 前面我们写过一个例子,通过点击四个按钮控制target按钮的移动
  • 现在我们通过引入快捷键来进行上述操作(此处按钮通过图标表示)

在界面中拖五个按钮

  • 五个按钮的objectName分别为pushButton_target ,pushButton_up ,pushButton_down ,pushButton_left ,pushButton_right

设置按钮的图标

实现按钮槽函数:

cpp 复制代码
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_right_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_left_clicked()
{
    //获取target位置
    QRect rect = ui->pushButton_target->geometry();
    ui->pushButton_target->setGeometry(rect.x() - 5, rect.y(), rect.width(), rect.height());
}

设置快捷键:在Widget的构造函数中实现,保证程序一启动,快捷键就有效

  • 通过按键名字来设置快捷键:setShortcut需要传入参数是QKeySequence对象(key:按键,sequence:序列;快捷键不一定是单个按键,可能是组合键)
cpp 复制代码
	ui->pushButton_up->setShortcut(QKeySequence("w"));
    ui->pushButton_down->setShortcut(QKeySequence("s"));
    ui->pushButton_right->setShortcut(QKeySequence("d"));
    ui->pushButton_left->setShortcut(QKeySequence("a"));
  • 通过枚举里设置快捷键
cpp 复制代码
    ui->pushButton_up->setShortcut(QKeySequence(Qt::Key_W));
    ui->pushButton_down->setShortcut(QKeySequence(Qt::Key_S));
    ui->pushButton_right->setShortcut(QKeySequence(Qt::Key_D));
    ui->pushButton_left->setShortcut(QKeySequence(Qt::Key_A));
  • 如果是多按键快捷键,则使用+号连接起来
cpp 复制代码
    ui->pushButton_up->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_W));
    ui->pushButton_down->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_S));
    ui->pushButton_right->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_D));
    ui->pushButton_left->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_A));

按钮的重复触发

  • 上面代码中,我们可以发现,键盘快捷键默认就能连发,但是鼠标点击默认是没有连发功能的,鼠标点击以下target就会移动一下
  • 使用setAutoRepeat来设置鼠标点击的连发功能
cpp 复制代码
    ui->pushButton_up->setAutoRepeat(true);
    ui->pushButton_down->setAutoRepeat(true);
    ui->pushButton_right->setAutoRepeat(true);
    ui->pushButton_left->setAutoRepeat(true);

二、Radio Button

  • QRadioButton 是单选按钮,可以让我们在多个选项中选择一个
  • 作为QAbstractButton 和QWidget 的子类,上面介绍的属性和用法对于QRadioButton 同样适用
  • QAbstractButton中和QRadioButton关系较大的属性
属性 说明
checkable 是否能选中
checked 是否已经被选中,checkable是checked的前提条件
autoExclusive 是否排他,选中一个按钮之后是否会取消其他按钮的选中。对于QRadioButton 来说默认就是排他的

选择性别

  • 在界面上创建⼀个label,和3个单选按钮:设置的文本(您选择的性别为:)、3个单选按钮的objectName 分别为radioButton_male、radioButton_female 、radioButton_other
  • 定义槽函数
  • 我们还可以添加一个默认选项(在没有选择时,默认是男)
  • 禁用其他选项
  1. 使用setCheckable只是能够让按钮不被选中,但是仍然可以响应点击事 ui->radioButton_other->setCheckable(false);
  2. 使用setEnabled或者setDisabled来禁用,这样不止可以让按钮不被选中,而且不再响应点击操作: ui->radioButton_other->setEnabled(false)或者ui->radioButton_other->setDisabled(true);

clicked、press、release、toggled的区别

• clicked:表示一次"点击"

• pressed:表示鼠标"按下"

• released:表示鼠标"释放"

• toggled:表示按钮状态切换

  • 在界面上创建四个单选按钮,给1创建clicked槽函数,给2创建pressed槽函数,给3创建released槽函数,给4创建toggled槽函数
cpp 复制代码
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;
}

当点击4,会打印日志toggled true,当再去点击1时,会打印toggled false和clicked: true

单选框分组(基于Radio Button实现一个简单的模拟点餐功能)

  • 在界面上创建6个单选框用来模拟麦当劳点餐界面
  • 此时直接运行程序可以看到,这六个QRadioButton 之间都是排他的。我们希望每一组内部来控制排他,但是组和组之间不能排他
  • 引入QButtonGroup进行分组(在构造函数中创建QButtonGroup)
cpp 复制代码
	// 创建三个 QButtonGroup
    QButtonGroup* group1 = new QButtonGroup(this);
    QButtonGroup* group2 = new QButtonGroup(this);
    QButtonGroup* group3 = new QButtonGroup(this);

    //把QRadioButton两两⼀组, 放到三个QButtonGroup中
     group1->addButton(ui->radioButton);
     group1->addButton(ui->radioButton_2);

     group2->addButton(ui->radioButton_3);
     group2->addButton(ui->radioButton_4);

     group3->addButton(ui->radioButton_5);
     group3->addButton(ui->radioButton_6);

运行实现了组与组之间的不排他性

三、Check Box

QCheckBox 表示复选按钮,可以允许选中多个,和QCheckBox 最相关的属性也是checkable 和checked ,都是继承自QAbstractButton (QCheckBox 独有的属性tristate 用来实现"三态复选框",这个东西比较冷门,在这里不做介绍)

获取复选按钮的取值

  • 在界面上创建三个复选按钮和一个普通按钮
  • 定义槽函数
cpp 复制代码
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);
}

最终运行结果是,当点击选中学习、打游戏、打工,点击确认按钮,在label标签中会显示今日你的安排是:学习 打游戏 打工

相关推荐
梨落秋霜1 天前
Python入门篇【序列切片】
开发语言·python
小北方城市网1 天前
第 6 课:全栈项目性能 & 安全双进阶 ——Redis 缓存 + JWT 认证(打造高并发高安全后端)
开发语言·数据库·redis·python·安全·缓存·数据库架构
flysh051 天前
C# 核心进阶:深度解析继承(Inheritance)与多态机制
开发语言·c#
java干货1 天前
拒绝应用层循环!用 MySQL 8.0 JSON_TABLE 一键把 JSON 数组“变”成表
数据库·mysql·json
蜗牛~turbo1 天前
云星空 应收款账龄分析取数SQL
数据库·sql·金蝶·云星空·k3 cloud
kylezhao20191 天前
第二节、C# 上位机核心数据类型详解(工控场景实战版)
开发语言·c#·上位机
l1t1 天前
一个用SQL Sever求解数独的SQL
数据库·sql·sql server·数独·sudoku
qq_393060471 天前
公x课视频播放
开发语言·python·音视频
郝学胜-神的一滴1 天前
Qt实现窗口阴影之美:光影交错间的界面艺术
开发语言·c++·qt·软件工程