目录
- 前言
- [一、Push Button](#一、Push Button)
- [二、Radio Button](#二、Radio Button)
-
- 选择性别
- clicked、press、release、toggled的区别
- [单选框分组(基于Radio Button实现一个简单的模拟点餐功能)](#单选框分组(基于Radio Button实现一个简单的模拟点餐功能))
- [三、Check Box](#三、Check Box)
前言
书接上文【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
- 定义槽函数
- 我们还可以添加一个默认选项(在没有选择时,默认是男)
- 禁用其他选项
- 使用setCheckable只是能够让按钮不被选中,但是仍然可以响应点击事
ui->radioButton_other->setCheckable(false);
- 使用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标签中会显示今日你的安排是:学习 打游戏 打工










