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());
}
相关推荐
William_cl3 小时前
C# MVC网页调试的方法
开发语言·c#·mvc
小蕾Java3 小时前
Java 开发工具,最新2025 IDEA 使用,保姆级教程
java·开发语言·intellij-idea
Автомата Калашникова3 小时前
Java操作.docx文档 —— docx4j
java·开发语言
小龙报3 小时前
《彻底理解C语言指针全攻略(3)》
c语言·开发语言·windows·git·创业创新·学习方法·visual studio
GISer_Jing4 小时前
Next.js数据获取演进史
java·开发语言·javascript
棉猴4 小时前
GESP C++等级认证三级15-原码反码补码2-2
开发语言·c++·gesp·c++三级·等级认证·原码反码补码
DokiDoki之父4 小时前
Web核心—JSP入门/EL/JSTL标签/MVC+三层架构/一文速通
java·开发语言
寒月霜华4 小时前
java-高级技术(单元测试、反射)
java·开发语言·单元测试·反射
很㗊5 小时前
C与C++---指针、引用、结构体及内存管理
c语言·开发语言