Qt浅谈之三十七界面文字显示动态化

一、简介

 

        最近项目中有需求:界面显示时所有的静态数据都以动态刷新的方式显示。在原来的代码上加上几个定时器QTimer就可以实现了,处理好showEvent和hideEvent事件(总体比较简单)。

 

二、详解

1、代码

(1)processbardynamic.h

#ifndef PROCESSBARDYNAMIC_H
#define PROCESSBARDYNAMIC_H

#include <QtGui>

class ProcessbarDynamic : public QWidget
{
    Q_OBJECT

public:
    ProcessbarDynamic(QWidget *parent = 0);
    ~ProcessbarDynamic();

protected:
    void paintEvent(QPaintEvent *event);
    void resizeEvent (QResizeEvent * event);
    void mousePressEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);
    void showEvent(QShowEvent *event);
    void hideEvent(QHideEvent *event);

private slots:
    void slotUpdateTimer();
    void slotMoneyTimer();

private:
    QPoint beginDrag;
    bool bPressFlag;
    QLabel *firstLabel;
    QLabel *secondLabel;
    QPushButton *closeBtn;
    QTimer *moneyTimer;
    QTimer *updateTimer;
    QProgressBar *progressBar;
    QLabel *progressBarLabel;
    QPushButton *sureBtn;

    int currentMoneyValue;
    int currentNumValue;
    int currentPercentValue;
};

#endif // PROCESSBARDYNAMIC_H

(2)processbardynamic.cpp

#include "processbardynamic.h"
#define MAXMONEY 660066
#define MAXNUM 15
#define MAXPERCENT 60

ProcessbarDynamic::ProcessbarDynamic(QWidget *parent)
    : QWidget(parent, Qt::FramelessWindowHint)
    , bPressFlag(false)
    , currentMoneyValue(0)
    , currentNumValue(0)
    , currentPercentValue(0)
{
    resize(300, 150);
    setAutoFillBackground(false);
    QPalette pal = palette();
    pal.setColor(QPalette::Background, QColor(0xFF,0xFF,0xFF,0xFF));
    setPalette(pal);

    firstLabel = new QLabel(this);
    firstLabel->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
    firstLabel->setText(tr("<font color='#666666'>%1</font><font color='#FC822B' size=4><b>$%2</b></font>").arg(tr("remainingmoney")).arg("0"));

    secondLabel = new QLabel(this);
    secondLabel->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
    secondLabel->setText(QString("<font color='#666666'>%1</font><font color='#FC822B' size=4><b>%2</b></font><font color='#666666'>%3</font>").arg(tr("input")).arg(0).arg(tr("number")));

    progressBar = new QProgressBar(this);
    progressBar->setRange(0, 100);
    progressBar->reset();
    progressBar->setValue(0);
    progressBar->setTextVisible(false);

    progressBar->setStyleSheet("QProgressBar{border:none;background:#E5E5E5;border-radius:2px;}"
                              "QProgressBar::chunk{background:#009DD6;border-radius:2px;}");
    progressBarLabel = new QLabel(this);
    progressBarLabel->setStyleSheet("color:#333333;");
    progressBarLabel->setAlignment(Qt::AlignCenter);
    progressBarLabel->setFont(QFont("arial", 10, QFont::Normal));
    progressBarLabel->setText(QString("%1%").arg(0));

    sureBtn = new QPushButton(this);
    sureBtn->setFont(QFont("arial", 10, QFont::Normal));
    sureBtn->setStyleSheet("QPushButton{border:none;color:#FFFFFF;background:#009DD6;border-radius:4px;}"
                           "QPushButton:hover{border-color:green;background:#00ACF0;}");
    sureBtn->setFocusPolicy(Qt::NoFocus);
    sureBtn->setText(tr("sure"));

    moneyTimer = new QTimer(this);
    moneyTimer->setInterval(1);
    connect(moneyTimer, SIGNAL(timeout()), this, SLOT(slotMoneyTimer()));
    updateTimer = new QTimer(this);
    updateTimer->setInterval(20);
    connect(updateTimer, SIGNAL(timeout()), this, SLOT(slotUpdateTimer()));

    closeBtn = new QPushButton(this);
    closeBtn->setStyleSheet("QPushButton{background-image:url(:/close.png);border-style:flat;}"
                            "QPushButton:hover{background-image:url(:/close_hover.png);border-style:flat;}");
    closeBtn->setFocusPolicy(Qt::NoFocus);
    connect(closeBtn, SIGNAL(clicked()), this, SLOT(close()));
}

ProcessbarDynamic::~ProcessbarDynamic()
{
    if (updateTimer->isActive()) {
        updateTimer->stop();
    }
    if (moneyTimer->isActive()) {
        moneyTimer->stop();
    }
    currentMoneyValue = 0;
    currentNumValue = 0;
    currentPercentValue = 0;
}

void ProcessbarDynamic::slotUpdateTimer()
{
    if (currentNumValue <= MAXNUM) {
        secondLabel->setText(QString("<font color='#666666'>%1</font><font color='#FC822B' size=4><b>%2</b></font><font color='#666666'>%3</font>").arg(tr("input")).arg(currentNumValue).arg(tr("number")));
    }
    if (currentPercentValue <= MAXPERCENT) {
        progressBar->setValue(currentPercentValue);
        progressBarLabel->setText(QString("%1%").arg(currentPercentValue));
    }
    if (currentNumValue > MAXNUM && currentPercentValue > MAXPERCENT) {
        updateTimer->stop();
    }
    currentNumValue++;
    currentPercentValue++;
}

void ProcessbarDynamic::slotMoneyTimer()
{
    if (currentMoneyValue <= MAXMONEY) {
        QString value = "";
        int number = currentMoneyValue;
        if (number < 1000) {
            value = QString::number(number);
        }
        else if (number < 1000 * 1000) {
            value = QString::number(number/1000);
            value += ",";
            //QString temp = "";
            //temp = QString::number(number%1000);
            //temp = temp.rightJustified(3,'0');
            //temp.fill('0', 3);
            //temp.push_back(QString::number(number));
            //temp = temp.right(3);
            value += QString("%1").arg(number%1000, 3, 10, QChar('0'));
        }
        else if (number < 1000*1000*1000) {
            value = QString::number(number/(1000*1000));
            value += ",";
            number = number%(1000*1000);
            value += QString("%1").arg(number/1000, 3, 10, QChar('0'));
            value += ",";
            value += QString("%1").arg(number%1000, 3, 10, QChar('0'));

        }
        firstLabel->setText(tr("<font color='#666666'>%1</font><font color='#FC822B' size=4><b>$%2</b></font>").arg(tr("remainingmoney")).arg(value));
    }
    if (currentMoneyValue == MAXMONEY){
        moneyTimer->stop();
    }
    currentMoneyValue = currentMoneyValue + 500;
    if (currentMoneyValue > MAXMONEY) {
        currentMoneyValue = MAXMONEY;
    }
}

void ProcessbarDynamic::paintEvent(QPaintEvent *event)
{
    QWidget::paintEvent(event);
}

void ProcessbarDynamic::resizeEvent(QResizeEvent *event)
{
    firstLabel->setGeometry(15, 25, 150, 30);
    secondLabel->setGeometry(165, 25, 120, 30);
    progressBar->setGeometry(15, 73, 230, 5);
    progressBarLabel->setGeometry(255, 62, 30, 25);
    sureBtn->setGeometry(15, 90, 270, 45);
    closeBtn->setGeometry(width() - 15, 5, 10, 10);
    move((QApplication::desktop()->width() - width())/2,  (QApplication::desktop()->height() - height())/2);
    QWidget::resizeEvent(event);
}

void ProcessbarDynamic::showEvent(QShowEvent *event)
{
    currentMoneyValue = 0;
    currentNumValue = 0;
    currentPercentValue = 0;
    updateTimer->start();
    moneyTimer->start();
    QWidget::showEvent(event);
}

void ProcessbarDynamic::hideEvent(QHideEvent *event)
{
    if (updateTimer->isActive()) {
        updateTimer->stop();
    }
    if (moneyTimer->isActive()) {
        moneyTimer->stop();
    }
    QWidget::hideEvent(event);
}

void ProcessbarDynamic::mousePressEvent(QMouseEvent *event)
{
    bPressFlag = true;
    beginDrag = event->pos();
    QWidget::mousePressEvent(event);
}

void ProcessbarDynamic::mouseMoveEvent(QMouseEvent *event)
{
    if (bPressFlag) {
        QPoint relaPos(QCursor::pos() - beginDrag);
        move(relaPos);
    }
    QWidget::mouseMoveEvent(event);
}

void ProcessbarDynamic::mouseReleaseEvent(QMouseEvent *event)
{
    bPressFlag = false;
    QWidget::mouseReleaseEvent(event);
}

(3)main.cpp

#include "processbardynamic.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QTranslator translator;
    translator.load("processbardynamic.qm",":/");
    a.installTranslator(&translator);
    ProcessbarDynamic w;
    w.show();

    return a.exec();
}

(4)运行(隐藏再显示也会重新动态显示)

三、总结

(1)上述代码难度不大,仅提供一种显示方式。测试代码已上传到CSDN:http://download.csdn.net/detail/taiyang1987912/9347839
(2)若有建议,请留言,在此先感谢!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

乌托邦2号

博文不易,支持的请给予小小打赏

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

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

打赏作者

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

抵扣说明:

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

余额充值