目录

一,Push Button

1.1 QAbstractButton

1.2 给按钮加图标

1.3 给按钮添加快捷键

二,Radio Button

2.1 介绍

2.2 另几个槽函数 

2.3 模拟点餐

三,Check Button

四,补充


前言:后面我们会依次介绍按钮类、显示类、输入类等各种控件,上篇文章介绍的 QWidget 中的各种属性、API使用等,对于后面介绍的各种 Qt 控件都是有效的

一,Push Button

1.1 QAbstractButton

QPushButton 表示一个按钮,我们前面使用过很多次,继承自 QAbstractButton,这个类是一个抽象类,是其他按钮的父类,如下图:

关于抽象类:c++面向对象三大特性——多态_c++三大特性实例-CSDN博客

是一个包含纯虚函数的类,无法创建出实例,仅仅是为了被派生类继承

并且派生类继承后后也不能实例化出对象。只有重写虚函数派生类才能实例化出对象

QPushButton本身没有什么很重要的属性,因为重要的属性大多数都包含在父类 QAbstractButton中,如下列表:

属性 说明
text 按钮中的文本
icon 按钮中的图标
iconSize 按钮中图标的尺寸
shortCut 按钮对应的快捷键
autoRepeat

按钮能否重复触发,就是按住鼠标左键不松开时:

设为true:会持续产生点击事件

设为false:只有释放鼠标,再次点击时才会触发事件

autoRepeatDelay 重复触发的延迟时间,长按按钮多久之后,开始重复触发
autoRepeatInterval 重复触发的周期

1.2 给按钮加图标

首先是准备一张图片,用的还是 qrc 机制,这里不再赘述

先创建一个按钮,然后用代码添加图片:

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    QIcon icon(":/deepseek.png"); //创建图标对象
    ui->pushButton->setIcon(icon); //设置图标
    ui->pushButton->setIconSize(QSize(50, 50)); //设置图标大小
}

1.3 给按钮添加快捷键

我们之前写过一个例子,就是通过四个按钮来实现按钮的四个方向的移动的,那个是通过鼠标点击的,那么这次我们可以引入快捷键来操作,我们使用我们打游戏时常用的 WSAD 四个方向键作为快捷键

首先创建一些按钮,如下:

我已经提前搞好了四个方向的图片 

然后我们台南佳快捷键的 API 是 setShortcut :

关于 QKeySequence 对象:

  • key表示按键,sequence 表示序列,也就是顺序表
  • 因为我们按下的快捷键不一定是单个按键,也可能是两个的或三个以上的组合键

 如下Widget.cpp 的代码:

#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
#include<QLabel>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //先设置这些按钮的图标,可以使用匿名对象
    ui->pushButton_target->setIcon(QIcon(":/deepseek.png"));
    ui->pushButton_target->setIconSize(QSize(80, 80));

    ui->pushButton_up->setIcon(QIcon(":/direction/up.png"));
    ui->pushButton_up->setIconSize(QSize(50, 50));

    ui->pushButton_down->setIcon(QIcon(":/direction/down.png"));
    ui->pushButton_down->setIconSize(QSize(50, 50));

    ui->pushButton_left->setIcon(QIcon(":/direction/left.png"));
    ui->pushButton_left->setIconSize(QSize(50, 50));

    ui->pushButton_right->setIcon(QIcon(":/direction/right.png"));
    ui->pushButton_right->setIconSize(QSize(50, 50));

    //添加快捷键,直接写字母或者组合键时容易写错
//    ui->pushButton_up->setShortcut(QKeySequence("ctrl + w"));
//    ui->pushButton_down->setShortcut(QKeySequence("ctrl + s"));
//    ui->pushButton_left->setShortcut(QKeySequence("ctrl + a"));
//    ui->pushButton_right->setShortcut(QKeySequence("ctrl + d"));

      //还可以通过按键的枚举来设置快捷键按键
      ui->pushButton_up->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_W));
      ui->pushButton_down->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_S));
      ui->pushButton_left->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_A));
      ui->pushButton_right->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_D));
      
      //开启鼠标点击的连发功能(键盘快捷键默认就是连发模式)
      ui->pushButton_up->setAutoRepeat(true);
      ui->pushButton_down->setAutoRepeat(true);
      ui->pushButton_left->setAutoRepeat(true);
      ui->pushButton_right->setAutoRepeat(true);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_pushButton_up_clicked()
{
    QRect rect = ui->pushButton_target->geometry(); //获取 target 的位置
    ui->pushButton_target->setGeometry(rect.x(), rect.y() - 10, rect.width(), rect.height());
}

void Widget::on_pushButton_down_clicked()
{
    QRect rect = ui->pushButton_target->geometry(); //获取 target 的位置
    ui->pushButton_target->setGeometry(rect.x(), rect.y() + 10, rect.width(), rect.height());
}

void Widget::on_pushButton_left_clicked()
{
    QRect rect = ui->pushButton_target->geometry(); //获取 target 的位置
    ui->pushButton_target->setGeometry(rect.x() - 10, rect.y(), rect.width(), rect.height());
}

void Widget::on_pushButton_right_clicked()
{
    QRect rect = ui->pushButton_target->geometry(); //获取 target 的位置
    ui->pushButton_target->setGeometry(rect.x() + 10, rect.y(), rect.width(), rect.height());
}

效果如下:

二,Radio Button

2.1 介绍

QRadioButton 是单选按钮,可以让我们在多个选项中选择一个,重要的属性有下面几个:

属性 说明
checkable 能否被选中
checked 是否已经被选中(前提条件是checkable)
autoExclusive 是否排它,就是选中一个按钮后取消其它按钮的选中,默认是这个

下面来演示一下:


先创建几个单选按钮出来:

假设我们要实现两个期望:①程序启动时默认选中第一个  ②禁用333选项(不可点击),可以在构造函数中更改属性:

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    ui->radioButton_1->setChecked(true); //添加一个默认选项,使程序启动时默认选一个
    //ui->radioButton_3->setCheckable(false); //也可以设置一个选项为禁用
    ui->radioButton_3->setEnabled(false); //上面的虽不可选中,但是仍会触发信号,所以用这个
    //ui->radioButton_3->setDisabled(true); //和上面效果一样,直接将选项搞成灰色
}

 效果如下:

2.2 另几个槽函数 

右键按钮的转到槽中,我们前面最常用的就是不带参的 clicked(),下面我们来认识下其它的:

再加一个 444 选项后,让四个选项分别选中四个槽函数,如下:

下面的槽函数展示了各具体的功能:

void Widget::on_radioButton_1_clicked(bool checked)
{
    //这个参数就表示了当前 rabioButton 的选中状态
    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;
}

2.3 模拟点餐

先创建一个类似的菜单页面,如下:

我们的期望是顾客可以在三条选项中,每个各选一个,但是现在是9个选项全绑在一起,也就输9个选项里都只能选一个,所以这是我们现在要解决的一个关键问题

一旦界面上存在“多组”单选按钮,我们希望组与组之间不要有影响,所以 Qt 提供了一个工具类 QButtonGroup,可以针对单选按钮进行分组,代码如下:

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    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);
    group3->addButton(ui->radioButton_9);

}

 效果如下:

三,Check Button

  • 和上面的单选按钮对应,QCheckBox 表示复选按钮,可以允许选中多个,它的关键属性也是 checkable 和 checked,因为都是继承自 QAbstractButton 父类
  • 至于 QCheckBox 独有的属性 tristate 是用来实现“三态复选框” 的,但是这个东西很冷门,也用得非常少,这里不过多讨论
  • 但是对于其它的基本才做,和上述单选按钮基本一致,这里也不再赘述,直接上代码

 假设我要搞一个每日任务表,如下:

我们的期望是,当我们选择好要干的事情后,就在最上面的 Label 中排列显示我们要干的事情,按钮槽函数如下:

void Widget::on_pushButton_ok_clicked()
{
    QString result = "今天的安排是: ";
    if(ui->checkBox->isChecked())
    {
        result += ui->checkBox->text();
    }
    if(ui->checkBox_2->isChecked())
    {
        if(ui->checkBox->isChecked()) result += ",";
        result += ui->checkBox_2->text();
    }
    if(ui->checkBox_3->isChecked())
    {
        if(ui->checkBox->isChecked() || ui->checkBox_2->isChecked()) result += ",";
        result += ui->checkBox_3->text();
    }
    ui->label->setText(result);
}

效果如下:

附:如果要想 label 正确显示所有选项,在创建 label 时就要注意创建长一点或宽一点的 label ,不然就只会显示部分(我当时以为是bug,搞了几十分钟才知道是这个原因)

    四,补充

    当退出qrc文件后,再次双击 qrc 文件想切换回刚才的qrc编辑器,大概率是没有反应的,下面介绍三种办法

    方法一

    如果之前打开过 qrc 文件且目前的窗口没有关闭过,那么可以在上面的下拉菜单里打开,如下图:

    方法二

    如果下拉菜单里没有 qrc 文件,那么可以用右键 qrc 文件,选择用资源编辑器打开:

    方法三

    如果还是不行,可以直接在电脑资源管理器里打开项目目录,找到qrc,右键使用 Qt 打开:

    Logo

    开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

    更多推荐