Qt 5.14.2 学习记录 —— 십일 QLCDNumber、QProgressBar、QCalendarWidget

发布于:2025-02-10 ⋅ 阅读:(43) ⋅ 点赞:(0)


1、QLCDNumber

在这里插入图片描述
在这里插入图片描述

写一个倒计时程序。拖一个LCD Number到界面:

在这里插入图片描述

定时器用Qt的QTimer类,这个类的对象会产生一个timeout信号,通过start方法来开启定时器,并且参数中设定触发timeout信号的周期,单位是ms,之后通过connect给timeout信号绑定上一个槽函数就可以了。

// widget.h
class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

    void handle();

private:
    Ui::Widget *ui;
    QTimer* timer;
};

// widget.cpp
#include <QDebug>
#include <QTimer>

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

    ui->lcdNumber->display(10);

    timer = new QTimer(this);
    // 先连接再启动timer
    connect(timer, &QTimer::timeout, this, &Widget::handle);
    timer->start(1000);
}

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

void Widget::handle()
{
    int value = ui->lcdNumber->intValue();
    if (value <= 0)
    {
        timer->stop();
        return ;
    }
    ui->lcdNumber->display(value - 1);
}

如果不用QTimer类

#include <QTimer>
#include <thread>

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

    ui->lcdNumber->display(10);

    std::thread t([this] () {
        int value = this->ui->lcdNumber->intValue();
        while (true)
        {
            // 作用于当前线程
            std::this_thread::sleep_for(std::chrono::seconds(1));
            if (value <= 0)
                break;
            this->ui->lcdNumber->display(--value);
        }
    });
}

用线程去写,是因为如果直接在构造函数里写,那就得等到构造完才能呈现界面,那么数字倒数的界面就无法呈现。但是像上面的代码会出错:terminate called without an active exception,因为Qt中有主线程来维护界面,为了线程安全,Qt不允许其它线程修改界面。之前的槽函数就是由主线程调用的,所以没问题。所以这个思路行不通。

在main.cpp文件中

return a.exec();

这句代码会让主线程进入事件循环,exec一直在循环,每执行一次循环,都会有一些固定的事件来操作。

2、ProgressBar

进度条。

在这里插入图片描述
在这里插入图片描述

关于对齐

Qt::AlignLeft:左对齐
Qt::AlignRight:右对齐
Qt::AlignCenter:居中对齐
Qt::AlignJustify:两端对齐

放一个ProgressBar到界面上

在这里插入图片描述

调整属性,让其初始为0

在这里插入图片描述

// widget.h
#include <QTimer>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

    void handle();

private:
    Ui::Widget *ui;
    QTimer* timer;
};

// widget.cpp
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);
}

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

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

改个颜色,右键控件,改变样式表

QProgressBar::chunk { background: red;}

chunk就表示进度条中有颜色的那部分。然后改ProgressBar的alignment属性来设定数字对齐方式。

3、QCalendarWidget

日历

在这里插入图片描述

信号

selectionChanged(const QDate&) 当选中的日期发生改变时发出。

在这里插入图片描述

放一个Label和Calendar Widget

在这里插入图片描述

转到日历的selectionChanged槽函数

void Widget::on_calendarWidget_selectionChanged()
{
    QDate date = ui->calendarWidget->selectedDate();
    ui->label->setText(date.toString());
}

结束。


网站公告

今日签到

点亮在社区的每一天
去签到