QRadioButton(续)+ CheckBox + QLabel(2)
文章目录
- QRadioButton(续)
- 模拟点餐程序(对单选按钮进行分组)
- 测试转到槽定义的四个槽函数
- QCheckBox
- QLabel (显示类控件)
- 核心属性
- QLabel 的文本格式
- QLabel 设置图片
- 事件
- widget.cpp
QRadioButton(续)
模拟点餐程序(对单选按钮进行分组)
1. 想基于QRadioButton
去实现一个简单的模拟点餐的功能,可以直接通过编辑widget.ui
2. 可是去运行程序的时候,我想要在汉堡中选择一个,在小吃中选择一个,在饮料中选择一个。可是这8个按钮总共也就只能点击一个
3. 这是因为QRadioButton
默认是排他的,一旦界面上需要存在多组
单选按钮的时候,咱们希望组和组之间不要有影响。而QButtonGroup
类可以针对单选按钮进行分组
#include "widget.h"
#include "ui_widget.h"
#include<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_3);group2->addButton(ui->radioButton_4);group2->addButton(ui->radioButton_5);group3->addButton(ui->radioButton_6);group3->addButton(ui->radioButton_7);group3->addButton(ui->radioButton_8);
}Widget::~Widget()
{delete ui;
}
测试转到槽定义的四个槽函数
1. 在widget.ui
文件中,右键单选按钮radio Button
转到槽去定义槽函数,会出现五个选项,这五个函数触发信号的方式各不相同,clicked
不讨论(前面基本上都在用)
2. 这个pressed
当鼠标点击(还没松开)时就相当于发出信号,而released
则是鼠标点击之后松开了就发出信号(鼠标点击时不会发出信号),其实clicked
就相当于这两个的结合(效果感觉跟released
相同,可能底层实现不同)
released
触发信号的条件
3. toggled(bool checked)
只有当checked
的状态发生改变的时候才会去触发这个信号。clicked(bool checked)
里的checked
表示了当前radioButton
的选中状态,它也是鼠标一松一放才算是触发一次信号
toggled
触发信号的条件
4. widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include<QDebug>void Widget::on_radioButton_pressed()
{qDebug() << "pressed";
}void Widget::on_radioButton_2_released()
{qDebug() << "released";
}void Widget::on_radioButton_3_clicked(bool checked)
{// 此处的checked就表示了当前radioButton的选中状态// 选中了checked为true,不选中则为fasleqDebug() << "clicked:" << checked;
}void Widget::on_radioButton_4_toggled(bool checked)
{// 当checked的状态发生改变的时候,才会触发这个信号qDebug() << "toggled:" << checked;
}
QCheckBox
QCheckBox
表示复选按钮,可以允许选中多个
1. 设计一个程序,用户可以选中多个安排任务,点击确认后,在上面文本中打印出今天的安排(别忘了改这三个复选按钮的对象名objectName
)
2. 将该确认按钮转到槽定义,获取到每个复选按钮的状态作为if
语句的判断条件,选中则添加该复选按钮的文本
void Widget::on_pushButton_clicked()
{QString result = "今天的安排是:";if (ui->checkBox_game->isChecked()){result += ui->checkBox_game->text();}if (ui->checkBox_study->isChecked()){result += ui->checkBox_study->text();}if (ui->checkBox_playout->isChecked()){result += ui->checkBox_playout->text();}// 重新设置label的文本ui->label->setText(result);
}
QLabel (显示类控件)
QLabel
可以用来显示图片和文本
核心属性
属性 | 说明 |
---|---|
text | QLabel 中的文本 |
textFormat | 文本的格式Qt::PlainText 纯文本 →最普通的文本Qt::RichText 富文本(支持 html 标签) →内容更丰富的文本Qt::MarkdownText markdown 格式Qt::AutoText 根据文本内容自动决定文本格式 |
pixmap | QLabel 内部包含的图片 |
scaledContents | 设为 true 表示内容自动拉伸填充 QLabel 设为 false 则不会自动拉伸 |
alignment | 对齐方式 可以设置水平和垂直方向如何对齐。 |
wordWrap | 设为 true 内部的文本会自动换行 设为 false 则内部文本不会自动换行 |
indent | 设置文本缩进,水平和垂直方向都生效 |
margin | 内部文本和边框之间的边距 不同于 indent ,是上下左右四个方向都同时有效而 indent 最多只是两个方向有效(具体哪两个方向有效取决于 alignment ) |
openExternalLinks | 是否允许打开一个外部的链接 (当 QLabel 文本内容包含 url 的时候涉及到) |
buddy | 给 QLabel 关联一个 “伙伴”,这样点击 QLabel 时就能激活对应的伙伴例如伙伴如果是一个 QCheckBox ,那么该 QCheckBox 就会被选中 |
QLabel 的文本格式
1. 文本常用的格式(CSDN就包含两种主流书写格式:富文本和markdown)
Qt::PlainText
纯文本 →最普通的文本Qt::RichText
富文本(支持html
标签) →内容更丰富的文本,比如word
工具编辑的文件就可以认为是一种富文本Qt::MarkdownText
markdown 格式,markdown格式是一个非常常用的书写文档的格式,它里面提供了各种特殊符号来表示不同的样式/格式
2. 通过编辑widget.ui
文件 + 代码去演示上面三种文本的样式
3. 在富文本中和markdown
文本中得分别加上额外的标签和符号去表示不同的样式。比如在富文本中使用<b>
标签,则表示文本加粗。在markdown
文本中使用#
,则为一级标题
QLabel 设置图片
1. 之前都是在label
中输入一段文本内容,而这里我想要将一张图片插入到label
,然后让这label
控件和图片一起铺满整个窗口
- 先用
qrc
机制将图片导入
- 这里首先要先获取到该窗口的
geometry
属性,再将该属性设置到label
控件上
- 将图片导入到对象
QPixmap
中,在让label
控件设置该对象
- 如果该图片导入后无法铺满整个
label
控件或者无法将这副图片完整的显示在label
控件中(这是因为图片自身的尺寸大小
),就要启用自动拉伸
,此时该图片就能自动填满整个窗口了
2. 当咱们去拉伸窗口,也就是窗口的尺寸发生改变的时候,会发现该图片没有跟着一起变化
ui->label->setGeometry();
因为在上面代码中是在构造函数里,进行这样的尺寸设置,而这个设置相当于是一次性的。一旦程序运行起来后,QLabel
的尺寸就固定下来了,窗口发生改变,此时QLabel
是不会发生变化的
事件
- 用户的操作,会对应一些信号。在Qt中,表示用户的操作有两类概念,一个是信号,另一个是事件
- 当用户拖拽修改窗口大小的时候,就会触发
resize
事件 (resizeEvent
)。像resize
这样的事件是连续变化的,也就是把窗口尺寸从 A 拖到B这个过程中,会触发出一系列的resizeEvent
- 此时就可以借助
resizeEvent
来完成上述的功能,可以让Widget
窗口类重写父类(QWidget
)的resizeEvent
虚函数 - 在鼠标拖动窗口尺寸的过程中这个虚函数就会被反复调用执行,每次触发一个
resizeEvent
事件都会调用一次对应的虚函数 - 由于此处进行了函数重写,调用父类的虚函数就会实际调用到子类的对应的函数(多态)
#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
#include<QResizeEvent> // 这里别忘记去包头文件,还要在widget.h中去声明该函数
// 这里的形参event是非常有用的,这里就包含了触发 resize 事件这一时刻窗口的具体尺寸数值
void Widget::resizeEvent(QResizeEvent *event)
{qDebug() << event->size();ui->label->setGeometry(0, 0, event->size().width(), event->size().height());
}
- 在实际编程中,指定回调函数其实有很多种写法
- 设置函数指针
- 设置仿函数(函数对象)
- 设置
lambda
- 通过重写父类虚函数(框架中拿着父类的指针调用这个函数,如果你创建了子类重写了这个函数,此时在多态机制下,实际执行的就是子类的函数了)
- Qt 的信号槽
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
#include<QResizeEvent>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 先要获取到该窗口的geometry,将label的坐标原点设置到(0,0)// 将label设置成和窗口一样大,这样能铺满整个窗口QRect windowRect = this->geometry();ui->label->setGeometry(0, 0, windowRect.width(), windowRect.height());// 如果直接写成这种形式:setGeometry(0,0,800,600)-> 这样的做法称为硬编码,在代码中直接写死某个值QPixmap pixmap(":/eye.jpg");ui->label->setPixmap(pixmap);// 启动自动拉伸,此时图片就能铺满整个窗口了ui->label->setScaledContents(true);}Widget::~Widget()
{delete ui;
}// 这里的形参event是非常有用的,这里就包含了触发 resize 事件这一时刻窗口的具体尺寸数值
void Widget::resizeEvent(QResizeEvent *event)
{qDebug() << event->size();ui->label->setGeometry(0, 0, event->size().width(), event->size().height());
}