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

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());
}
http://www.xdnf.cn/news/12844.html

相关文章:

  • 【Go语言基础【20】】Go的包与工程
  • c#,Powershell,mmsys.cpl,使用Win32 API展示音频设备属性对话框
  • JavaWeb预习(jdbc)
  • 拼多多官方内部版 7.58.0 | 极限精简,只有2.5M
  • 【笔记】Poetry虚拟环境创建示例
  • Prompt Tuning(提示调优)到底训练优化的什么部位
  • DiscuzX3.5发帖json api
  • maven 1.0.0idea的使用说明
  • Vue3学习(watchEffect,标签的ref属性,计数器,defineExpose)
  • SpringCloud学习笔记-4
  • 实验二:数码管动态显示实验
  • 建造者模式深度解析与实战应用
  • WEB3技术重要吗,还是可有可无?
  • STM32入门学习之系统时钟配置
  • K8S认证|CKS题库+答案| 7. Dockerfile 检测
  • 五、jmeter脚本参数化
  • PHP中如何定义常量以及常量和变量的主要区别
  • Spark流水线+Gravitino+Marquez数据血缘采集
  • java综合项目开发一课一得
  • 使用 Melos 高效管理 Flutter/Dart Monorepo 项目
  • 用 Melos 解决 Flutter Monorepo 的依赖冲突:一个真实案例
  • Python 包管理器 uv 介绍
  • 基于PostGIS的各地级市路网长度统计及Echarts图表可视化实践-以湖南省为例
  • 支持selenium的chrome driver更新到137.0.7151.68
  • 时序数据库IoTDB结合SeaTunnel实现高效数据同步
  • 七、Sqoop Job:简化与自动化数据迁移任务及免密执行
  • Ubuntu20.04中 Redis 的安装和配置
  • 通过Cline使用智能体
  • webpack其余配置
  • uni-app学习笔记二十七--设置底部菜单TabBar的样式