009 Qt_显示类控件_QLCDNumber、ProgressBar、Calendar

前言

本文将会向你介绍显示类控件中QLCDNumber显示数字、ProgressBar进度条、Calendar日历

LCD Number

QLCDNumer 是⼀个专门用来显示数字的控件. 类似于 “老式计算器” 的效果.

属性说明
intValueQLCDNumber 显示的数字值(int).
valueQLCDNumber 显示的数字值(double).和 intValue 是联动的.例如给 value 设为 1.5, intValue 的值就是 2.另外, 设置 value 和 intValue 的⽅法名字为 display , ⽽不是 setValue 或setIntValue .
digitCount显示几位数字.
mode数字显示形式.1. QLCDNumber::Dec :⼗进制模式,显示常规的⼗进制数字。2. QLCDNumber::Hex :⼗六进制模式,以⼗六进制格式显示数字。3. QLCDNumber::Bin :⼆进制模式,以⼆进制格式显示数字。4. QLCDNumber::Oct :⼋进制模式,以⼋进制格式显⽰数字。只有⼗进制的时候才能显示小数点后的内容
segmentStyle设置显示风格.1. QLCDNumber::Flat :平面的显示风格,数字呈现在⼀个平坦的表⾯上。2.QLCDNumber::Outline :轮廓显示风格,数字具有清晰的轮廓和阴影效果。3. QLCDNumber::Filled :填充显⽰⻛格,数字被填充颜⾊并与背景区分开
smallDecimalPoint设置比较小的小数点.

示例一 :倒计时

①在界面上创建一个QLCDNumber控件,初始值设置为10
在这里插入图片描述
②修改widget.h代码,创建⼀个 QTimer 成员, 和⼀个 updateTime 函数

QTimer* timer;
void updateTime();

③修改widget.cpp文件,初始化QTimer,使用connect将QTimer::timeout信号和Widget::updateTime函数连接起来,每次触发QTimer::timeout信号都会执行Widget::updateTime函数。通过start函数启动定时器后就会隔一个周期触发一次QTimer::timeout信号

updateTime:通过intValue获取到QLCDNumber内部的数值,如果value的值归0了,就停止QTimer,停止后QTimer就不会触发timeout信号了

#include "widget.h"
#include "ui_widget.h"
#include <QTimer>
#include <QDebug>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //创建QTimer实例
    timer = new QTimer(this);
    //每次触发timeout信号都会伴随着updateTime函数执行
    connect(timer, &QTimer::timeout, this, &Widget::updateTime);
    //启动QTimer,每隔1000ms触发一次timeout信号
    timer->start(1000);
}

void Widget::updateTime()
{
    qDebug() << "updateTime";
    int value = ui->lcdNumber->intValue();
    if(value <= 0)
    {
    	//停止定时器
        timer->stop();
        return;
    }
    //更新LCDNunmer控件上的数值
    ui->lcdNumber->display(value - 1);
}

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

④执行程序,观察倒计时结果
在这里插入图片描述
值得注意的是:上述的实现方式利用了 Qt 的信号与槽机制,使得 QTimer 的 timeout 信号可以方便地连接到自定义的槽函数 updateTime,从而实现倒计时。我们可以容易地想到用一个循环实现倒计时,即在一个循环里,每次sleep1s,value–,然后更新显示在LCDNumber的值

#include "widget.h"
#include "ui_widget.h"
#include <thread>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    int value = ui->lcdNumber->intValue();
    while(true){
        std::this_thread::sleep_for(std::chrono::seconds(1));
        if(value <= 0) break;
        //将数值显示在lcdNumber上
        ui->lcdNumber->display(value-1);
    }
}
Widget::~Widget()
{
    delete ui;
}


以上的代码很明显是不行的,原因是
在Qt中,主线程负责处理所有的用户界面事件和更新,包括绘制窗口和处理用户输入。
使用while (true)循环并在循环中调用std::this_thread::sleep_for将会使得主线程在构造函数中被完全阻塞。在这个时间段内,Qt无法处理任何其他事件,也无法更新UI,因此就不要想着界面1s接着1s的更新了,整个界面根本就出不来!!!

那我们将循环+sleep的代码逻辑放到另一个线程是否能解决这个问题?

    std::thread t([this](){
            int value = ui->lcdNumber->intValue();
            while(true){
                std::this_thread::sleep_for(std::chrono::seconds(1));
                if(value <= 0)
                    break;
            }
    });

以上代码同样是不可以的,Qt中规定,任何对于GUI上内容的操作,都必须在主线程中完成的,而我们使用自己创建的线程尝试对界面元素进行修改时,Qt程序可能会导致崩溃
因此,使用定时器是实现倒计时功能的最合理方案

ProgressBar

ProgressBar表示一个进度条

属性说明
minimum进度条最⼩值
maximum进度条最⼤值
value进度条当前值
alignment⽂本在进度条中的对齐方式.
textVisible进度条的数字是否可见.
orientation进度条的方向是水平还是垂直
invertAppearance是否是朝反方向增长进度
textDirection文本的朝向.
format展示的数字格式.%p :表示进度的百分比(0-100) %v :表示进度的数值(0-100)%m :表示剩余时间(以毫秒为单位) %t :表⽰总时间(以毫秒为单位

示例一:一个按时间增长的进度条

①在界面上拖拽一个Progress Bar
在这里插入图片描述
其中最小值设为 0, 最大值设为 100. 当前值设为 0

②修改widget.cpp文件,初始化QTimer

#include "widget.h"
#include "ui_widget.h"
#include <QTimer>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    timer = new QTimer(this);
    connect(timer, &QTimer::timeout, this, &Widget::updateProgressBar);
    timer->start(100);
}


void Widget::updateProgressBar(){
    int value = ui->progressBar->value();
    if(value >= 100)
    {
        timer->stop();
        return;
    }
    ui->progressBar->setValue(value + 1);
}

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

③ 运行程序,就可以看到一个随时间增长的进度条了

Calendar Widget

QCalendarWidget 表示⼀个 “日历”

核心属性

属性说明
selectDate当前选中的日期
minimumDate最小日期
maximumDate最大日期
firstDayOfWeek每周的第⼀天(也就是⽇历的第⼀列) 是周⼏
gridVisible是否显示表格的边框
selectionMode是否允许选择日期
navigationBarVisible日历上⽅标题是否显示
horizontalHeaderFormat日历上方标题显示的日期格式
verticalHeaderFormat日历第⼀列显示的内容格式
dateEditEnabled是否允许日期被编辑

重要信号

信号说明
selectionChanged(constQDate&)当选中的日期发生改变时发出
activated(const QDate&)当双击⼀个有效的日期或者按下回车键时发出,形参是⼀个QDate类型,保存了选中的⽇期
currentPageChanged(int, int)当年份月份改变时发出,形参表示改变后的新年份和⽉份

示例一:获取选中的日期

①拖拽一个QCalendarWidget和一个label到界面上
在这里插入图片描述

② 给QCalendarWidget添加槽函数

#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());
}

③ 运行程序,观察到选择一个日期的时候,label也随之发生改变
在这里插入图片描述

小结

今日的分享就到这里啦,如果本文存在疏漏或错误的地方还请您能够指出

<think>好的,用户现在在询问如何查看他们列出的QtQuick/Controls目录下的文件列表。他们之前遇到了QML模块缺失的问题,现在可能是在检查安装情况。我需要解释这些文件的作用,特别是如何确认模块版本是否存在。 首先,用户运行了ls命令,显示了一堆.qml、.qmlc和插件文件。我需要解释这些文件类型,比如.qml是QML源码,.qmlc是编译后的缓存,还有插件库.so文件。然后,用户之前的问题是关于QtQuick.Controls 2.12未安装,所以需要指导他们如何确认版本是否正确。 用户可能想知道这些文件是否包含所需的2.12版本。我需要指出检查qmldir文件的重要性,因为里面会注明模块版本。如果用户没有找到正确的版本号,可能需要安装对应的包或者检查Qt安装路径是否正确。 另外,用户可能在嵌入式环境(RK3588)下工作,需要注意架构是否匹配,比如aarch64目录是否正确。还要提醒他们确认Qt安装是否完整,或者是否需要部署额外的文件到设备上。 需要给出具体的命令,比如查看qmldir内容,检查版本号,以及可能的解决方案,如安装特定包或设置环境变量。同时,如果版本不对,可能需要更新Qt或重新部署模块。 最后,确保回答清晰,步骤明确,帮助用户一步步排查问题,确认模块是否存在,以及如何解决版本不匹配的问题。</think>这是您当前系统安装的QtQuick.Controls模块内容列表,我们可以通过以下方式解读这些文件结构和版本信息: 📂 目录结构解析: ``` /usr/lib/aarch64-linux-gnu/qt5/qml/QtQuick/Controls ├── *.qml # QML组件源文件(可读文本) ├── *.qmlc # 预编译的QML字节码(优化执行速度) ├── plugins.qmltypes # 类型注册文件 ├── qmldir # 模块声明文件(关键版本信息) └── libqtquickcontrolsplugin.so # 核心插件库 ``` 🔍 关键检查步骤: 1. **确认模块版本**(通过qmldir文件) ```bash cat qmldir # 输出内容应包含类似: # module QtQuick.Controls # typeinfo plugins.qmltypes # prefer :/qt-project.org/imports/QtQuick/Controls/ # depends QtQuick 2.12 # depends QtQuick.Templates 2.12 ``` 2. **架构验证** ```bash # 当前路径显示为 aarch64-linux-gnu # 确认与目标设备(RK3588)架构匹配 uname -m # 应输出 aarch64 ``` 3. **版本对应检查** ```bash # 查看Qt安装版本 qmake --version # 对比输出中的Qt版本是否包含 5.12.x 系列(对应Controls 2.12) ``` ⚠️ 问题判断依据: - 如果`qmldir`中没有`2.12`版本标注,说明安装的是旧版Controls - 缺少`Controls.2`子目录(新版Controls 2.x的典型结构) 🔧 解决方案建议: 1. **修复版本不匹配** ```bash # 卸载当前版本 sudo apt remove qml-module-qtquick-controls # 安装指定版本(以Ubuntu 20.04为例) sudo apt install qml-module-qtquick-controls2=5.12.8+dfsg-0ubuntu1 ``` 2. **部署缺失的Controls 2.x模块** ```bash # 手动创建新版目录结构 sudo mkdir -p /usr/lib/aarch64-linux-gnu/qt5/qml/QtQuick/Controls.2 sudo cp -r /path/to/correct/version/* /usr/lib/aarch64-linux-gnu/qt5/qml/QtQuick/ ``` 3. **环境变量调试** ```bash # 临时添加QML路径测试 export QML2_IMPORT_PATH=/usr/lib/aarch64-linux-gnu/qt5/qml ./rk3588 -platform linuxfb ``` 💡 技术细节说明: - `.qmlc`文件是Qt Quick Compiler生成的预编译文件,可提升加载速度 - `libqtquickcontrolsplugin.so`是核心插件,若损坏会导致所有控件失效 - `plugins.qmltypes`文件定义了QML组件与C++后端的类型映射 📌 验证成功的标志: ``` 部署后目录应包含: QtQuick/ ├── Controls/ # 原始Controls 1.x └── Controls.2/ # Controls 2.x(含2.12版本) ``` 如果仍存在问题,建议检查RK3588设备的`/usr/lib/qt5/qml`路径是否存在完整模块,或考虑重新交叉编译Qt 5.12.8并指定`-qmlimport`参数指向正确路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fan_558

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值