八、利用Qt 图形界面,设计一个倒计时时钟,显示剩余的秒数(最大99秒),显示到0为止,要求

2024-12-17 16:32:35
推荐回答(2个)
回答1:

建议你这样试试看:

#ifndef QWAITTINGDIALOG_H

#define QWAITTINGDIALOG_H

 

#include

#include

#include

#include

 

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

#include "QWaittingDialog.h"

#include

#include

 

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));   // 配合全透明属性一起使用

}


这样做的好处:

注意事项:

回答2:

热死