当前位置: 首页 > news >正文

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可以用来显示图片和文本

核心属性

属性说明
textQLabel 中的文本
textFormat文本的格式
Qt::PlainText 纯文本 →最普通的文本
Qt::RichText 富文本(支持 html 标签) →内容更丰富的文本
Qt::MarkdownText markdown 格式
Qt::AutoText 根据文本内容自动决定文本格式
pixmapQLabel 内部包含的图片
scaledContents设为 true 表示内容自动拉伸填充 QLabel
设为 false 则不会自动拉伸
alignment对齐方式
可以设置水平和垂直方向如何对齐。
wordWrap设为 true 内部的文本会自动换行
设为 false 则内部文本不会自动换行
indent设置文本缩进,水平和垂直方向都生效
margin内部文本和边框之间的边距
不同于 indent,是上下左右四个方向都同时有效
indent 最多只是两个方向有效(具体哪两个方向有效取决于 alignment)
openExternalLinks是否允许打开一个外部的链接
(当 QLabel 文本内容包含 url 的时候涉及到)
buddyQLabel 关联一个 “伙伴”,这样点击 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());
}

相关文章:

  • Spring Cloud微服务架构实践指南
  • 为什么要引入内联函数?
  • 71常用控件_QHBoxLayout的使用
  • OCS2库及其在足式机器人上的应用
  • 直观地理解程序的堆和栈
  • 三维图形、地理空间、激光点云渲染技术术语解析笔记
  • hot100 -- 11.二分查找系列
  • JVM内存区域与溢出异常详解
  • 算法工程师认知水平要求总结
  • 华为OD机考 - 水仙花数 Ⅰ(2025B卷 100分)
  • 数学建模期末速成 主成分分析的基本步骤
  • Z-FOLD: A Frustratingly Easy Post-Training Quantization Scheme for LLMs
  • 实战:如何用SCINet增强YOLOv8在低照度下的目标检测性能(附完整代码)
  • Linux安全加固:从攻防视角构建系统免疫
  • 打造优质技术文档指南
  • 基于RT-DETR算法的夜间交通车辆与行人目标检测
  • 附加模块--Qt OpenGL模块功能及架构
  • 68常用控件_QGroupBox的使用
  • 【Linux】HAProxy:结合 WG 实现内网 TCP 反代
  • 大数据CSV导入MySQL
  • 路由器搭建wordpress/上海专业seo
  • 襄阳的网站建设公司/扫一扫识别图片
  • 广州安全教育平台登录账号/优化营商环境
  • 描写做网站专业的句子/泰安seo网络公司
  • 怎么做公司的中英文网站/广州百度seo 网站推广
  • 怎么快速提高网站权重/seo网络优化招聘