Qt实现简单倒计时

1.效果图

效果gif

2.代码结构 

3.关键类

 QWaittingDialog.h

#ifndef QWAITTINGDIALOG_H
#define QWAITTINGDIALOG_H

#include <QDialog>
#include <QLabel>
#include <QThread>
#include <QTimer>

class QWaittingDialog : public QDialog
{
    Q_OBJECT
public:
    explicit QWaittingDialog(QWidget *parent = nullptr);

    void Run(int nStartValue);

signals:

public slots:
    void on_timer_timeout();

private:
    QLabel*             m_pLabel;
    QTimer*             m_pTimer;
    int                 m_nStartValue;


    // QWidget interface
protected:
    void paintEvent(QPaintEvent* event);
};


#endif // QWAITTINGDIALOG_H

QWaittingDialog.cpp

#include "QWaittingDialog.h"
#include <QPainter>
#include <QVBoxLayout>

QWaittingDialog::QWaittingDialog(QWidget *parent) : QDialog(parent)
    , m_nStartValue(0)
{
    setWindowFlags(Qt::FramelessWindowHint | Qt::Tool | Qt::WindowStaysOnTopHint);

    // 全透明
    setAttribute(Qt::WA_TranslucentBackground);

    QVBoxLayout* pVBoxLayout = new QVBoxLayout(this);

    m_pLabel = new QLabel();
    pVBoxLayout->addWidget(m_pLabel);

    m_pLabel->setText("");
    m_pLabel->setAlignment(Qt::AlignCenter);

    QString strStyle = "QLabel{"
                       "font-family: \"Microsoft YaHei\";"
                       "font-size: 128px;"
                       "color: rgb(50, 50, 50, 180);"
                       "}";

    m_pLabel->setStyleSheet(strStyle);

    m_pTimer = new QTimer(this);
    connect(m_pTimer, &QTimer::timeout, this, &QWaittingDialog::on_timer_timeout);
    m_pTimer->setInterval(1000);
}

void QWaittingDialog::Run(int nStartValue)
{
    m_pTimer->stop();

    m_nStartValue = nStartValue;

    QWidget* parent = parentWidget();
    move(parent->pos());
    resize(parent->rect().width(), parent->rect().height());

    on_timer_timeout();
    m_pTimer->start();

    show();
}

void QWaittingDialog::on_timer_timeout()
{
    if (m_nStartValue == 0)
    {
        m_pTimer->stop();
        close();
        return;
    }

    m_pLabel->setText(QString::number(m_nStartValue));

    m_nStartValue--;
}



void QWaittingDialog::paintEvent(QPaintEvent* event)
{
    // 避免鼠标穿透
    QPainter painter(this);
    painter.fillRect(this->rect(), QColor(240, 240, 240, 1));   // 配合全透明属性一起使用
}

调用示例

    QWaittingDialog* dlg = new QWaittingDialog(this);
    dlg->Run(3);

资源下载链接:下载

(该资源正在审核,待审核通过后更新)

### 回答1: 在Qt中,可以使用QLCDNumber小部件来实现倒计时的效果。 首先,我们需要创建一个QLCDNumber对象,并设置其显示的格式和初始的倒计时时间。例如,我们可以使用以下代码: ```cpp QLCDNumber *lcdNumber = new QLCDNumber; lcdNumber->setDigitCount(2); // 设置显示的位数 lcdNumber->setSegmentStyle(QLCDNumber::Flat); // 设置显示的样式,这里使用了扁平风格 lcdNumber->display(60); // 设置初始的倒计时时间为60秒 ``` 接下来,我们可以使用QTimer来控制倒计时的进度。通过设置定时器的interval,可以控制倒计时的速度。例如,我们可以使用以下代码: ```cpp QTimer *timer = new QTimer; connect(timer, SIGNAL(timeout()), this, SLOT(updateTime())); // 每次定时器超时时,都会执行updateTime()槽函数 timer->start(1000); // 设置定时器的超时时间为1秒 ``` 接着,我们需要在updateTime()槽函数中实现倒计时的逻辑。每次槽函数被调用时,我们可以将QLCDNumber的显示值减1,并判断当前倒计时的时间是否为0。例如,我们可以使用以下代码: ```cpp void MyClass::updateTime() { int remainingTime = lcdNumber->intValue(); // 获取当前的倒计时时间 if (remainingTime > 0) { lcdNumber->display(remainingTime - 1); // 将倒计时时间减1,并更新显示 } else { // 倒计时结束,执行相关操作 timer->stop(); // 停止定时器 // ... } } ``` 最后,我们需要在合适的地方将QLCDNumber小部件添加到窗口中,以便能够显示倒计时的效果。例如,我们可以使用以下代码: ```cpp QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(lcdNumber); setLayout(layout); ``` 以上是在Qt实现QLCDNumber倒计时简单示例,你可以根据自己的需求进行相应的修改和扩展。 ### 回答2: 在Qt中,可以使用QLCDNumber小部件来实现倒计时功能。首先,我们需要创建一个QLCDNumber实例并将其设置为倒计时显示模式。倒计时显示模式会自动将数字显示为倒计时的格式,比如显示为"00:00:10"。 下面是一个简单的示例代码: ```cpp #include <QApplication> #include <QLCDNumber> #include <QTimer> int main(int argc, char *argv[]) { QApplication app(argc, argv); // 创建一个QLCDNumber实例 QLCDNumber lcdNumber; // 设置倒计时显示模式 lcdNumber.setDigitCount(8); // 设置显示的位数,比如"00:00:10"有8位 lcdNumber.setSegmentStyle(QLCDNumber::SegmentStyle::Flat); // 设置显示样式 // 设置倒计时的起始值 int countdownTime = 10; // 单位为秒 lcdNumber.display(countdownTime); // 创建一个定时器,每隔1秒执行一次更新倒计时数值的操作 QTimer countdownTimer; countdownTimer.setInterval(1000); // 设置定时器间隔为1秒 QObject::connect(&countdownTimer, &QTimer::timeout, [&]() { countdownTime--; lcdNumber.display(countdownTime); if (countdownTime == 0) { countdownTimer.stop(); // 倒计时结束,可以在这里添加逻辑处理 } }); // 启动倒计时定时器 countdownTimer.start(); // 显示主窗口 lcdNumber.show(); return app.exec(); } ``` 在以上示例中,我们首先创建一个QLCDNumber实例,并将其设置为倒计时显示模式,然后使用QLCDNumber的display方法设置初始倒计时时间。接下来,我们创建一个定时器,每隔1秒执行一次更新倒计时数值和显示的操作。在定时器的槽函数中,我们根据倒计时时间的变化更新QLCDNumber的显示值,并在倒计时结束时停止定时器,并可以在此处添加倒计时结束后的逻辑处理。最后,我们启动倒计时定时器并显示QLCDNumber实例的主窗口。 希望以上回答对您有所帮助! ### 回答3: 在Qt中,可以使用QLCDNumber小部件来实现倒计时功能。首先,在Qt的设计界面中添加一个QLCDNumber小部件,并给它命名为lcdNumber。 然后,在代码中,我们需要声明一个计时器对象,并连接计时器的timeout()信号到一个槽函数。在槽函数中,我们首先获取QLCDNumber的当前值,然后将其减少1,并将新值设置回QLCDNumber。然后,我们判断如果倒计时已经到0,我们停止计时器。 下面是一个简单的示例代码: ```cpp #include <QtWidgets> class MyWidget : public QWidget { Q_OBJECT public: explicit MyWidget(QWidget* parent = nullptr) : QWidget(parent) { QVBoxLayout* layout = new QVBoxLayout(this); layout->addWidget(lcdNumber); timer.setInterval(1000); // 设置计时器间隔为1秒 connect(&timer, &QTimer::timeout, this, &MyWidget::updateCountdown); // 连接计时器timeout信号到槽函数 } private slots: void updateCountdown() { int currentValue = lcdNumber->intValue(); // 获取当前值 if (currentValue > 0) { lcdNumber->display(currentValue - 1); // 将值减1并显示到QLCDNumber } else { timer.stop(); // 倒计时到0,停止计时器 } } private: QTimer timer; QLCDNumber* lcdNumber = new QLCDNumber(this); }; int main(int argc, char* argv[]) { QApplication app(argc, argv); MyWidget widget; widget.show(); widget.lcdNumber->display(10); // 设置倒计时初始值为10 widget.timer.start(); // 启动计时器 return app.exec(); } #include "main.moc" ``` 在这个示例中,我们创建了一个自定义QWidget,其中包含了一个QLCDNumber小部件。我们使用QLCDNumber的display()函数将初始倒计时的值设置为10,并使用计时器对象开始倒计时。每次计时器的timeout()信号触发后,都会调用updateCountdown()槽函数,该函数将QLCDNumber当前值减1,并显示在QLCDNumber上。当倒计时到0时,我们停止计时器。 这样,我们就实现了在Qt中使用QLCDNumber进行倒计时的功能。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值