前言:
在Qt框架中,控件是构建用户界面的基本元素,它们允许用户与应用程序进行交互。本段代码主要介绍了Qt中的几种常用控件:QPushButton(按钮)、QRadioButton(单选按钮)和QCheckBox(复选框)。这些控件不仅具有基本的交互功能,还支持图标、快捷键设置、状态变更信号等高级特性,使得开发者可以创建出既美观又实用的用户界面。通过具体的代码示例,我们可以看到如何利用这些控件来实现具体的功能,如按钮的图标和快捷键设置、单选按钮的分组管理以及复选框的状态管理。
之前,QWidget 中涉及到的各种属性/函数/使用方法,针对接下来要介绍的Qt的各种控件都是有效的。
1.Push Button
使用 QPushButton
表示一个按钮,这也是当前我们最熟悉的一个控件了。
QPushButton
继承自 QAbstractButton
。这个类是一个抽象类,是其他按钮的父类。
抽象类 这个类包含了纯虚函数,无法创建出实例(对象)
就得创建子类,重写上述虚函数,才能创建出子类的实例。
QAbstractButton
中,和QPushButton
相关性较大的属性:
1.1.给按钮加图标(图片)
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 创建一个图标对象
QIcon icon(":/sdq.png");
// 设置图标
ui->pushButton->setIcon(icon);
//设置图标尺寸
ui->pushButton->setIconSize(QSize(50, 50));
}
Widget::~Widget()
{
delete ui;
}
1.2. 给按钮添加快捷键
前面写过一个例子,通过四个按钮,控制target
按钮移动
之前这个移动述同过鼠标点击按钮来实现的
此处就可以引入快捷键,通过快捷键来实现操作
此处按钮直接用图片来表示
- 步骤:
1)创建 qrc 文件,导入资源
2)编辑ui文件,创建界面
3)编写构造函数,来完成一些初始化操作
4)实现方向键的槽函数
5)设置快捷键(关键点) 也是需要再Widget的构造函数中完成,程序一启动,快捷键就是有效的
6)连发功能
键盘快捷键,默认就是能连发的,但是鼠标快捷键点击按钮则不行
#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(":/sdq.png"));
ui->pushButton_target->setIconSize(QSize(70, 70));
ui->pushButton_up->setIcon(QIcon(":/up.png"));
ui->pushButton_up->setIconSize(QSize(40, 40));
ui->pushButton_down->setIcon(QIcon(":/down.png"));
ui->pushButton_down->setIconSize(QSize(40, 40));
ui->pushButton_left->setIcon(QIcon(":/left.png"));
ui->pushButton_left->setIconSize(QSize(40, 40));
ui->pushButton_right->setIcon(QIcon(":/right.png"));
ui->pushButton_right->setIconSize(QSize(40, 40));
// 直接通过按键的名字设置跨界键设置快捷键
ui->pushButton_up->setShortcut(QKeySequence("ctrl+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::CTRL + 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));
// 开启鼠标的连发功能(键盘连发默认就是支持的)
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()
{
// 获取 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());
}
2. Radio Button
QRadioButton
是单选按钮. 可以让我们在多个选项中选择⼀个.
作为 QAbstractButton
和 QWidget
的子类, 上面介绍的属性和用法, 对于 QRadioButton
同样适用。
QAbstractButton
中和 QRadioButton
关系较大的属性
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 添加一个默认的选项
ui->radioButton_male->setChecked(true);
ui->label->setText("您选择的性别为: 男");
// 禁用 其他 这个选项
// checkedable 只是能让这个按钮不被选中,仍然可以响应点击事件
//ui->radioButton_other->setCheckable(false);
ui->radioButton_other->setEnabled(false);
// ui->radioButton_other->setDisabled(true);
}
Widget::~Widget()
{
delete ui;
}
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("您选择的性别为:其他");
}
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;
}
- 基于
QRadioButton
实现一个简单的模拟点餐的功能:
RadioButton
默认是排他的
一旦界面上需要“多组”单选按钮的时候,希望组和组之间不要有互相影响。
QButtonGroup
类,可以针对单选按钮进行分组:
#include "widget.h"
#include "ui_widget.h"
#include <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);
group3->addButton(ui->radioButton_9);
}
Widget::~Widget()
{
delete ui;
}
3. Check Box
QCheckBox
表示复选按钮. 可以允许选中多个.
和 QCheckBox
最相关的属性也是 checkable
和 checked
, 都是继承⾃
QAbstractButton
.
⾄于 QCheckBox
独有的属性 tristate
用来实现 “三态复选框” . 这个东西比较冷门, 咱们不
做讨论。
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_clicked()
{
QString result = "今天你的安排是:";
if (ui->checkBox_learn->isChecked()) {
result += ui->checkBox_learn->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);
}
总结:
本文通过具体的代码示例,详细介绍了Qt中的几种常用控件及其使用方法。首先,我们学习了如何使用QPushButton来创建按钮,并为其添加图标和快捷键,还了解了如何通过重写信号和槽函数来响应按钮的点击事件。接着,我们探讨了QRadioButton单选按钮的使用,包括如何通过QButtonGroup类来实现单选按钮的分组,确保不同组的单选按钮互不影响。最后,我们了解了QCheckBox复选框的使用方法,包括如何检查复选框的状态,并根据选中的复选框更新界面上的信息。