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


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

二、详解

1、代码

(1)processbardynamic.h
[html] view plain copy
  1. #ifndef PROCESSBARDYNAMIC_H  
  2. #define PROCESSBARDYNAMIC_H  
  3.   
  4. #include <QtGui>  
  5.   
  6. class ProcessbarDynamic : public QWidget  
  7. {  
  8.     Q_OBJECT  
  9.   
  10. public:  
  11.     ProcessbarDynamic(QWidget *parent = 0);  
  12.     ~ProcessbarDynamic();  
  13.   
  14. protected:  
  15.     void paintEvent(QPaintEvent *event);  
  16.     void resizeEvent (QResizeEvent * event);  
  17.     void mousePressEvent(QMouseEvent *event);  
  18.     void mouseMoveEvent(QMouseEvent *event);  
  19.     void mouseReleaseEvent(QMouseEvent *event);  
  20.     void showEvent(QShowEvent *event);  
  21.     void hideEvent(QHideEvent *event);  
  22.   
  23. private slots:  
  24.     void slotUpdateTimer();  
  25.     void slotMoneyTimer();  
  26.   
  27. private:  
  28.     QPoint beginDrag;  
  29.     bool bPressFlag;  
  30.     QLabel *firstLabel;  
  31.     QLabel *secondLabel;  
  32.     QPushButton *closeBtn;  
  33.     QTimer *moneyTimer;  
  34.     QTimer *updateTimer;  
  35.     QProgressBar *progressBar;  
  36.     QLabel *progressBarLabel;  
  37.     QPushButton *sureBtn;  
  38.   
  39.     int currentMoneyValue;  
  40.     int currentNumValue;  
  41.     int currentPercentValue;  
  42. };  
  43.   
  44. #endif // PROCESSBARDYNAMIC_H  
(2)processbardynamic.cpp
[html] view plain copy
  1. #include "processbardynamic.h"  
  2. #define MAXMONEY 660066  
  3. #define MAXNUM 15  
  4. #define MAXPERCENT 60  
  5.   
  6. ProcessbarDynamic::ProcessbarDynamic(QWidget *parent)  
  7.     : QWidget(parent, Qt::FramelessWindowHint)  
  8.     , bPressFlag(false)  
  9.     , currentMoneyValue(0)  
  10.     , currentNumValue(0)  
  11.     , currentPercentValue(0)  
  12. {  
  13.     resize(300, 150);  
  14.     setAutoFillBackground(false);  
  15.     QPalette pal = palette();  
  16.     pal.setColor(QPalette::Background, QColor(0xFF,0xFF,0xFF,0xFF));  
  17.     setPalette(pal);  
  18.   
  19.     firstLabel = new QLabel(this);  
  20.     firstLabel->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);  
  21.     firstLabel->setText(tr("<font color='#666666'>%1</font><font color='#FC822B' size=4><b>$%2</b></font>").arg(tr("remainingmoney")).arg("0"));  
  22.   
  23.     secondLabel = new QLabel(this);  
  24.     secondLabel->setAlignment(Qt::AlignRight | Qt::AlignVCenter);  
  25.     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")));  
  26.   
  27.     progressBar = new QProgressBar(this);  
  28.     progressBar->setRange(0, 100);  
  29.     progressBar->reset();  
  30.     progressBar->setValue(0);  
  31.     progressBar->setTextVisible(false);  
  32.   
  33.     progressBar->setStyleSheet("QProgressBar{border:none;background:#E5E5E5;border-radius:2px;}"  
  34.                               "QProgressBar::chunk{background:#009DD6;border-radius:2px;}");  
  35.     progressBarLabel = new QLabel(this);  
  36.     progressBarLabel->setStyleSheet("color:#333333;");  
  37.     progressBarLabel->setAlignment(Qt::AlignCenter);  
  38.     progressBarLabel->setFont(QFont("arial", 10, QFont::Normal));  
  39.     progressBarLabel->setText(QString("%1%").arg(0));  
  40.   
  41.     sureBtn = new QPushButton(this);  
  42.     sureBtn->setFont(QFont("arial", 10, QFont::Normal));  
  43.     sureBtn->setStyleSheet("QPushButton{border:none;color:#FFFFFF;background:#009DD6;border-radius:4px;}"  
  44.                            "QPushButton:hover{border-color:green;background:#00ACF0;}");  
  45.     sureBtn->setFocusPolicy(Qt::NoFocus);  
  46.     sureBtn->setText(tr("sure"));  
  47.   
  48.     moneyTimer = new QTimer(this);  
  49.     moneyTimer->setInterval(1);  
  50.     connect(moneyTimer, SIGNAL(timeout()), this, SLOT(slotMoneyTimer()));  
  51.     updateTimer = new QTimer(this);  
  52.     updateTimer->setInterval(20);  
  53.     connect(updateTimer, SIGNAL(timeout()), this, SLOT(slotUpdateTimer()));  
  54.   
  55.     closeBtn = new QPushButton(this);  
  56.     closeBtn->setStyleSheet("QPushButton{background-image:url(:/close.png);border-style:flat;}"  
  57.                             "QPushButton:hover{background-image:url(:/close_hover.png);border-style:flat;}");  
  58.     closeBtn->setFocusPolicy(Qt::NoFocus);  
  59.     connect(closeBtn, SIGNAL(clicked()), this, SLOT(close()));  
  60. }  
  61.   
  62. ProcessbarDynamic::~ProcessbarDynamic()  
  63. {  
  64.     if (updateTimer->isActive()) {  
  65.         updateTimer->stop();  
  66.     }  
  67.     if (moneyTimer->isActive()) {  
  68.         moneyTimer->stop();  
  69.     }  
  70.     currentMoneyValue = 0;  
  71.     currentNumValue = 0;  
  72.     currentPercentValue = 0;  
  73. }  
  74.   
  75. void ProcessbarDynamic::slotUpdateTimer()  
  76. {  
  77.     if (currentNumValue <= MAXNUM) {  
  78.         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")));  
  79.     }  
  80.     if (currentPercentValue <= MAXPERCENT) {  
  81.         progressBar->setValue(currentPercentValue);  
  82.         progressBarLabel->setText(QString("%1%").arg(currentPercentValue));  
  83.     }  
  84.     if (currentNumValue > MAXNUM && currentPercentValue > MAXPERCENT) {  
  85.         updateTimer->stop();  
  86.     }  
  87.     currentNumValue++;  
  88.     currentPercentValue++;  
  89. }  
  90.   
  91. void ProcessbarDynamic::slotMoneyTimer()  
  92. {  
  93.     if (currentMoneyValue <= MAXMONEY) {  
  94.         QString value = "";  
  95.         int number = currentMoneyValue;  
  96.         if (number < 1000) {  
  97.             value = QString::number(number);  
  98.         }  
  99.         else if (number < 1000 * 1000) {  
  100.             value = QString::number(number/1000);  
  101.             value += ",";  
  102.             //QString temp = "";  
  103.             //temp = QString::number(number%1000);  
  104.             //temp = temp.rightJustified(3,'0');  
  105.             //temp.fill('0', 3);  
  106.             //temp.push_back(QString::number(number));  
  107.             //temp = temp.right(3);  
  108.             value += QString("%1").arg(number%1000, 3, 10, QChar('0'));  
  109.         }  
  110.         else if (number < 1000*1000*1000) {  
  111.             value = QString::number(number/(1000*1000));  
  112.             value += ",";  
  113.             number = number%(1000*1000);  
  114.             value += QString("%1").arg(number/1000, 3, 10, QChar('0'));  
  115.             value += ",";  
  116.             value += QString("%1").arg(number%1000, 3, 10, QChar('0'));  
  117.   
  118.         }  
  119.         firstLabel->setText(tr("<font color='#666666'>%1</font><font color='#FC822B' size=4><b>$%2</b></font>").arg(tr("remainingmoney")).arg(value));  
  120.     }  
  121.     if (currentMoneyValue == MAXMONEY){  
  122.         moneyTimer->stop();  
  123.     }  
  124.     currentMoneyValue = currentMoneyValue + 500;  
  125.     if (currentMoneyValue > MAXMONEY) {  
  126.         currentMoneyValue = MAXMONEY;  
  127.     }  
  128. }  
  129.   
  130. void ProcessbarDynamic::paintEvent(QPaintEvent *event)  
  131. {  
  132.     QWidget::paintEvent(event);  
  133. }  
  134.   
  135. void ProcessbarDynamic::resizeEvent(QResizeEvent *event)  
  136. {  
  137.     firstLabel->setGeometry(15, 25, 150, 30);  
  138.     secondLabel->setGeometry(165, 25, 120, 30);  
  139.     progressBar->setGeometry(15, 73, 230, 5);  
  140.     progressBarLabel->setGeometry(255, 62, 30, 25);  
  141.     sureBtn->setGeometry(15, 90, 270, 45);  
  142.     closeBtn->setGeometry(width() - 15, 5, 10, 10);  
  143.     move((QApplication::desktop()->width() - width())/2,  (QApplication::desktop()->height() - height())/2);  
  144.     QWidget::resizeEvent(event);  
  145. }  
  146.   
  147. void ProcessbarDynamic::showEvent(QShowEvent *event)  
  148. {  
  149.     currentMoneyValue = 0;  
  150.     currentNumValue = 0;  
  151.     currentPercentValue = 0;  
  152.     updateTimer->start();  
  153.     moneyTimer->start();  
  154.     QWidget::showEvent(event);  
  155. }  
  156.   
  157. void ProcessbarDynamic::hideEvent(QHideEvent *event)  
  158. {  
  159.     if (updateTimer->isActive()) {  
  160.         updateTimer->stop();  
  161.     }  
  162.     if (moneyTimer->isActive()) {  
  163.         moneyTimer->stop();  
  164.     }  
  165.     QWidget::hideEvent(event);  
  166. }  
  167.   
  168. void ProcessbarDynamic::mousePressEvent(QMouseEvent *event)  
  169. {  
  170.     bPressFlag = true;  
  171.     beginDrag = event->pos();  
  172.     QWidget::mousePressEvent(event);  
  173. }  
  174.   
  175. void ProcessbarDynamic::mouseMoveEvent(QMouseEvent *event)  
  176. {  
  177.     if (bPressFlag) {  
  178.         QPoint relaPos(QCursor::pos() - beginDrag);  
  179.         move(relaPos);  
  180.     }  
  181.     QWidget::mouseMoveEvent(event);  
  182. }  
  183.   
  184. void ProcessbarDynamic::mouseReleaseEvent(QMouseEvent *event)  
  185. {  
  186.     bPressFlag = false;  
  187.     QWidget::mouseReleaseEvent(event);  
  188. }  
(3)main.cpp
[html] view plain copy
  1. #include "processbardynamic.h"  
  2. #include <QApplication>  
  3.   
  4. int main(int argc, char *argv[])  
  5. {  
  6.     QApplication a(argc, argv);  
  7.     QTranslator translator;  
  8.     translator.load("processbardynamic.qm",":/");  
  9.     a.installTranslator(&translator);  
  10.     ProcessbarDynamic w;  
  11.     w.show();  
  12.   
  13.     return a.exec();  
  14. }  
(4)运行(隐藏再显示也会重新动态显示)


三、总结

(1)上述代码难度不大,仅提供一种显示方式。测试代码已上传到CSDN:http://download.csdn.net/detail/taiyang1987912/9347839
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值