前言:
这里所学习到的QPushButton、QRadioButton、QCheckButton以及QToolButton都继承于 QAbstractButton;
而 QAbstractButton 类又继承于 QWidget类(QWidget类继承于QObject)。
无论是这里的按钮类控件,还是文本框QLabel控件都是 QWidget的子类。
按钮 QPushButton
对于 QPushButton,这个按钮之前都是简单的创建一个按钮,关联槽函数这些,现在来学习 QPushButton的常用属性:
1. 图标 Icon
| 属性 | 说明 |
|---|---|
| icon | 按钮中的图片 |
| iconSize | 按钮在图片的尺寸 |
对于QPushButton按钮,我们是可以设置图标的:
cpp
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
QIcon icon(":/icon.jpg");
ui->pushButton->setIcon(icon);
ui->pushButton->setIconSize(QSize(50,50));
}
setIcon的参数类型是QIcon,在调用之前就要先创建一个QIcon对象并指的图片路径(qrc文件资源管理),可以创建匿名对象传参。setIconSize的参数类型是QSize,在调用时就要先构造一个QSize对象(长、宽)单位都是像素。
2. 快捷键 Shortcut
这里我们创建的按钮,都是通过鼠标点击来触发clicked信号;我们也可以设置对应的快捷键。
| 属性 | 说明 |
|---|---|
| Shortcut | 按钮对应的快捷键 |
在之前学习QWidget中geometry属性时,写了一个实例:通过4按钮控制另一个控件的上下左右移动;是使用鼠标点击的
有了快捷键,我们就可以通过键盘按键来触发信号,使用通过键盘来控制某一个控件的移动。
cpp
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
QIcon icon(":/1.jpg");
ui->pushButton->setIcon(icon);
ui->pushButton->setIconSize(QSize(50,50));
// 设置快捷键
ui->pushButton_up->setShortcut(Qt::Key_W);
ui->pushButton_down->setShortcut(Qt::Key_S);
ui->pushButton_left->setShortcut(Qt::Key_A);
ui->pushButton_right->setShortcut(Qt::Key_D);
}
void Widget::on_pushButton_up_clicked()
{
QRect rect = ui->pushButton->geometry();
qDebug() << rect;
ui->pushButton->setGeometry(rect.x(),rect.y() - 10, rect.width(), rect.height());
}
void Widget::on_pushButton_down_clicked()
{
QRect rect = ui->pushButton->geometry();
qDebug() << rect;
ui->pushButton->setGeometry(rect.x(),rect.y() + 10, rect.width(), rect.height());
}
void Widget::on_pushButton_left_clicked()
{
QRect rect = ui->pushButton->geometry();
qDebug() << rect;
ui->pushButton->setGeometry(rect.x() - 10, rect.y(), rect.width(), rect.height());
}
void Widget::on_pushButton_right_clicked()
{
QRect rect = ui->pushButton->geometry();
qDebug() << rect;
ui->pushButton->setGeometry(rect.x() + 10, rect.y(), rect.width(), rect.height());
}
这里设置快捷键也可以使用字符串,例如:"W"、"S"、"A"、"D"
当需要设置组合快捷键时,可以使用 Qt::Key_W + Qt::Key_Tab,也可以使用字符串:"W + Tab"
3. 连续触发 AutoRepeat
在上述的例子中,运行我们可以发现,按住W键不放,上面控件是可以一直向上移动的,通过输出信息也会发现:Clicked信号在一直触发;而使用鼠标点击,按住不放,只会移动一次。
| 属性 | 属性 |
|---|---|
| autoRepeat | 是否重复重复,如果为true,表示会连续触发;false表示不会连续触发 |
| autoRepeatDelay | 重复触发的延时时间. 按住按钮多久之后, 开始重复触发 |
| autoRepeatInterval | 重复触发的周期 |
对于这个属性,了解一下即可,这里就设置控件为连续触发,这样鼠标按住不放也会一直触发clicked信号。
cpp
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
QIcon icon(":/1.jpg");
ui->pushButton->setIcon(icon);
ui->pushButton->setIconSize(QSize(50,50));
// 设置快捷键
// ui->pushButton_up->setShortcut(Qt::Key_W + Qt::Key_Tab);
ui->pushButton_up->setShortcut(Qt::Key_W);
ui->pushButton_down->setShortcut(Qt::Key_S);
ui->pushButton_left->setShortcut(Qt::Key_A);
ui->pushButton_right->setShortcut(Qt::Key_D);
// 设置连续触发
ui->pushButton_up->setAutoRepeat(true);
ui->pushButton_down->setAutoRepeat(true);
ui->pushButton_left->setAutoRepeat(true);
ui->pushButton_right->setAutoRepeat(true);
}
单选按钮 QRadioButton
QRadioButton 是一个单选按钮,可以让我们在多个选项中选择其中的一个。
| 属性 | 说明 |
|---|---|
| checkable | 是否可以被选中 |
| checked | 是否被选中 |
| autoExcluSive | 是否排他(选择一个会取消另一个) |
这里
checkable的作用只是不能被选中,和Eabled不同的是:
checkable为false时,点击按钮也会触发clicked信号Enabled为false时,按钮不能被点击(按钮图标变灰色,无法点击)
示例:简单实现一个点单程序

在选择完成点击选好了按钮后,更新文本,显示出选择的主食、菜品、饮品
cpp
void Widget::on_pushButton_clicked()
{
QString str = "你的选择是 : ";
if(ui->radioButton_1->isChecked())
str += ui->radioButton_1->text() + " ";
if(ui->radioButton_2->isChecked())
str += ui->radioButton_2->text() + " ";
if(ui->radioButton_3->isChecked())
str += ui->radioButton_3->text() + " ";
if(ui->radioButton_4->isChecked())
str += ui->radioButton_4->text() + " ";
if(ui->radioButton_5->isChecked())
str += ui->radioButton_5->text() + " ";
if(ui->radioButton_6->isChecked())
str += ui->radioButton_6->text() + " ";
if(ui->radioButton_7->isChecked())
str += ui->radioButton_7->text() + " ";
if(ui->radioButton_8->isChecked())
str += ui->radioButton_8->text() + " ";
if(ui->radioButton_9->isChecked())
str += ui->radioButton_9->text() + " ";
ui->label->setText(str);
}
这里,除了点击选择,也可以通过代码,来设置按的选中状态。
分组 QButtonGroup
写了上述代码,我们会发现:点击一个按钮时,会自动取消另外的一个按钮;也就是在9个单选按钮中,只能选择一个。
要对单选按钮进行分组,这里就要用到 QButtonGroup
预期的效果是:主食里选择一个,菜品里选择一个、饮品里选择一个;
所以就要使用 QButtonGroup 讲这些按钮分为三组:
cpp
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// QButtonGroup group1;
QButtonGroup* group1 = new QButtonGroup(this);
group1->addButton(ui->radioButton_1);
group1->addButton(ui->radioButton_2);
group1->addButton(ui->radioButton_3);
// QButtonGroup group2;
QButtonGroup* group2 = new QButtonGroup(this);
group2->addButton(ui->radioButton_4);
group2->addButton(ui->radioButton_5);
group2->addButton(ui->radioButton_6);
// QButtonGroup group3;
QButtonGroup* group3 = new QButtonGroup(this);
group3->addButton(ui->radioButton_7);
group3->addButton(ui->radioButton_8);
group3->addButton(ui->radioButton_9);
}
注意:
为了保证分组的有效性,这里要在堆上创建 QButtonGroup对象。
按钮相关信号
对于按钮相关的信号,除了Clicked还有很多:
clicked: 点击产生信号clicked(bool):点击产生信号,参数表示当前是否被选中pressed:按下产生信号released: 松开产生信号toggled: 状态改变产生信号
复选按钮 QCheckBox
对于 QRadioButtn 单选,只能在一组中选择一个;
而复选按钮,QCheckBox,就可以同时选择多个。
示例:选择爱好/喜欢的游戏

当然,也可以加上一个按钮,选择完成后,点击按钮来显示选择的爱好。
cpp
void Widget::on_pushButton_clicked()
{
QString str = "你的爱好是 : ";
if(ui->checkBox_1->isChecked())
str += ui->checkBox_1->text() + " ";
if(ui->checkBox_2->isChecked())
str += ui->checkBox_2->text() + " ";
if(ui->checkBox_3->isChecked())
str += ui->checkBox_3->text() + " ";
if(ui->checkBox_4->isChecked())
str += ui->checkBox_4->text() + " ";
ui->label->setText(str);
qDebug() << str;
}
本篇文章到这里就结束了,感谢支持
我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2oul0hvapjsws