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

来源:互联网 发布:mysql front 乱码 编辑:程序博客网 时间:2024/06/07 03:51

一、简介

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

二、详解

1、代码

(1)processbardynamic.h
#ifndef PROCESSBARDYNAMIC_H#define PROCESSBARDYNAMIC_H#include <QtGui>class ProcessbarDynamic : public QWidget{    Q_OBJECTpublic:    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 60ProcessbarDynamic::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)若有建议,请留言,在此先感谢!

2 0