QT跨平台应用程序开发框架(5)—— 常用按钮控件
目录
一,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 打开: