QT-常用控件(三)-显示类

目录

Qlabel的属性

QLCDNunber的属性(计算器)

QProgressBar的属性(进度条)

QCalendarWidget(日历)


Qlabel的属性

该属性常用于显示文本和图片。

**格式:**在设置文本的格式testformat后,不同文本之间语法是并不互通的,<b></b>用于html格式,#等用于markdowntest格式。

图片:

cpp 复制代码
// 先把 QLabe1 设置成和窗口一样大,并且把这个 QLabel 左上角设置到窗口的左上角这里
// 让整个 QLabel 铺满整个窗口
ORect windowRect=this->geometry();
ui->label->setGeometry(0,0,windowRect.width(), windowRect.height());
QPixmap pixmap(":/huaji.png");
ui->label->setPixmap(pixmap);
//启动自动拉伸。此时图片就能够填充满整个窗口了.
ui->label->setscaledcontents(true);

仅仅只设置setGeometry是不能让图片填充满整个窗口的,因为图片本身可能有尺寸限制,需要用到**ui->label->setscaledcontents(true);**才行,但是拖拽边框后图片的样式 可能就不那么好看,会出现大量的空白。

解决方式:事件

用户的操作,会对应一些信号,Qt 中,表示用户的操作,有两类概念一个是信号,另一个是事件。
当用户拖拽修改窗口大小的时候,就会触发 resize 事件(resizeEvent)像 resize 这样的事件,是连续变化的.把窗口尺寸从 A拖到 B这个过程中,会触发出一系列的 resizeEvent此时就可以借resizeEvent 来完成上述的功能.,可以让 Widget 窗囗类, 重写父类(QWidget) 的 resizeEvent 虚函数
在鼠标拖动窗口尺寸的 过程中 这个函数就会被反复调用执行,每次触发一个 resizeEvent 事件都会调用一次对应的虚函数。

由于此处进行了函数重写,调用父类的虚函数就会实际调用到子类的对应的函数(多态)。

设置文本对齐:

设置伙伴:

Qt 中, QLabel 中写的文本,是可以指定"快捷键"此处快捷键的规则功能上要比 QPushButton 弱很多

是在文本中使用 & 跟上一个字符来表示快捷键。

比如 &A =>通过键盘上的 alt +a来触发这个快捷键.&B =>通过键盘上的 alt +b 来触发,绑定了伙伴关系之后,通过快捷键就可以选中对应的单选按钮/复选按钮。

QLCDNunber的属性(计算器)

定时器的设定:

方式一:

cpp 复制代码
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //设置初始值
    ui->lcdNumber->display(10);
    // 创建一个 QTimer 实例
    timer = new QTimer(this);
    // 把 QTimer 的 timeout 信号和咱们自己的槽函数进行连接
    connect(timer,&QTimer::timeout, this,&Widget::handle);
     // 启动定时器,参数是触发 timeout 的周期,单位是 ms
    timer->start(1000);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::handle()
{
    //先拿到 LCDNumber 中的数字
    int value =ui->lcdNumber->intValue();
    if(value<=0)
    {
        // 数字减到 0 了,停止定时器.
        timer->stop();
        return;
    }
    ui->lcdNumber->display(value -1);
}

屏幕录制 2025-10-12 165432

方式二:

现象:是10s后弹出结果为0的显示框。

原因:

方式三;多线程

结果依然是失败的,Qt 里,(main 函数所在的线程)界面有一个专门的线程去负责维护更新的(主线程),对于 GU 来说,内部包含了很多的隐藏状态,Qt 为了保证修改界面的过程中,线程安全是不会受到影响的,Qt禁止了其他线程直接修改界面。

QProgressBar的属性(进度条)

进度条

下面我们来创建一份进度条,让他随时间增长而增长,每个0.1秒+1;

进度条:

cpp 复制代码
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    timer=new QTimer(this);
    connect(timer,&QTimer::timeout,this,&Widget::handle);
    timer->start(100);
}
void Widget::handle()
{
    int value=ui->progressBar->value();
    if(value>=100)
    {
        timer->stop();
        return;
    }
    ui->progressBar->setValue(++value);
}
Widget::~Widget()
{
    delete ui;
}

进度条样式的设计:

cpp 复制代码
QProgressBar {
    border: 2px solid #ffb6c1; /* 粉色边框*/
    border-radius: 10px; /* 圆角,让进度条更柔和 */
    background-color: #fff0f5; /* 背景为浅粉色 */
}

QProgressBar::chunk {
    border-radius: 8px; /* 进度块的圆角,和外框呼应 */
    background: qlineargradient(x1:0, y1:0, x2:1, y2:0, stop:0 #ff69b4, stop:1 #ff1493); /* 进度块用亮粉色渐变,很活泼 */
}

Qt 中利用类前置声明减少头文件包含,从而优化编译速度的知识:

核心要点

  1. 前置声明的作用 :在 Qt 中,若只需使用类的指针 / 引用类型成员(如 QTimer* timer;),可通过类前置声明 (如 class QTimer;),无需在头文件中直接包含 QTimer 的头文件(#include <QTimer>)。因为指针 / 引用的声明不需要知道类的完整定义,只需知道类的存在即可。

  2. 编译速度优化 :C/C++ 编译速度慢,与 #include 头文件的复杂依赖关系直接相关。减少头文件包含能有效缩短编译时间。Qt 利用 "前置声明 + 仅在需要时包含头文件" 的方式,降低头文件间的依赖,从而优化编译效率。

  3. 实际开发的权衡:虽然前置声明能优化编译,但实际项目中,若为了开发便捷(避免手动管理头文件依赖),或项目有足够硬件资源(如大厂的 "编译集群"),也可直接包含所需头文件,优先保证开发效率。

简单来说:Qt 用 "类前置声明" 减少头文件包含来加速编译,但实际开发中,也可根据情况灵活选择是否直接包含头文件。

QCalendarWidget(日历)

目的:期望日期改变时,Qlabel进行显示;

代码:

cpp 复制代码
#include "widget.h"
#include "ui_widget.h"
#include"QDebug"
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}


void Widget::on_calendarWidget_selectionChanged()
{
     QDate date=ui->calendarWidget->selectedDate();
     qDebug()<<date;
     ui->label->setText(date.toString());
}
相关推荐
集智飞行23 分钟前
c++函数传参的几种推荐方式
开发语言·c++
鼾声鼾语43 分钟前
matlab的ros2发布的消息,局域网内其他设备收不到情况吗?但是matlab可以订阅其他局域网的ros2发布的消息(问题总结)
开发语言·人工智能·深度学习·算法·matlab·isaaclab
麦麦鸡腿堡1 小时前
Java_类的加载
java·开发语言
我命由我123451 小时前
VSCode - Prettier 配置格式化的单行长度
开发语言·前端·ide·vscode·前端框架·编辑器·学习方法
JIngJaneIL1 小时前
基于java + vue校园快递物流管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js
超级大只老咪1 小时前
数组的正向存储VS反向存储(Java)
java·开发语言·python
柏木乃一1 小时前
进程(2)进程概念与基本操作
linux·服务器·开发语言·性能优化·shell·进程
毕设源码-赖学姐1 小时前
【开题答辩全过程】以 基于JSP的物流信息网的设计与实现为例,包含答辩的问题和答案
java·开发语言
leo__5202 小时前
基于LDA的数据降维:原理与MATLAB实现
开发语言·matlab·信息可视化
asdfg12589632 小时前
JS中的闭包应用
开发语言·前端·javascript