QT:程序忙碌时的进度条——开启时间循环,等结束的时候再退出

时间:2023-12-11 22:51:14

当程序在执行一项(或多项)耗时比较久的操作时,界面总要有一点东西告诉用户“程序还在运行中”,那么,一个“没有终点”的进度条就是你需要的了。
PS:最好把耗时的操作扔到一个子线程中去,以免他阻塞了界面线程,造成程序卡死的假象。

思路:程序很简单,一个进度条,一个定时器就足够了。

截图:

QT:程序忙碌时的进度条——开启时间循环,等结束的时候再退出

源代码:

    1. #include <QtCore>
    2. #include <QtGui>
    3. class WaitingDialog : public QDialog
    4. {
    5. Q_OBJECT
    6. private:
    7. int m_CurrentValue;         //当前值
    8. int m_UpdateInterval;       //更新间隔
    9. int m_MaxValue;             //最大值
    10. QTimer m_Timer;
    11. QProgressBar *m_ProgressBar;
    12. public:
    13. WaitingDialog(QWidget *parent = 0);
    14. ~WaitingDialog();
    15. void Start(int interval=100, int maxValue=100);
    16. void Stop();
    17. private slots:
    18. void UpdateSlot();
    19. };
    20. WaitingDialog::WaitingDialog(QWidget *parent)
    21. {
    22. m_ProgressBar = new QProgressBar(this);
    23. m_CurrentValue = m_MaxValue = m_UpdateInterval = 0;
    24. m_ProgressBar->setRange(0, 100);
    25. connect(&m_Timer, SIGNAL(timeout()), this, SLOT(UpdateSlot()));
    26. m_ProgressBar->setTextVisible(false);
    27. QHBoxLayout *layout = new QHBoxLayout;
    28. layout->addWidget(m_ProgressBar);
    29. setLayout(layout);
    30. }
    31. WaitingDialog::~WaitingDialog()
    32. {
    33. }
    34. void WaitingDialog::UpdateSlot()
    35. {
    36. m_CurrentValue++;
    37. if( m_CurrentValue == m_MaxValue )
    38. m_CurrentValue = 0;
    39. m_ProgressBar->setValue(m_CurrentValue);
    40. }
    41. void WaitingDialog::Start(int interval/* =100 */, int maxValue/* =100 */)
    42. {
    43. m_UpdateInterval = interval;
    44. m_MaxValue = maxValue;
    45. m_Timer.start(m_UpdateInterval);
    46. m_ProgressBar->setRange(0, m_MaxValue);
    47. m_ProgressBar->setValue(0);
    48. }
    49. void WaitingDialog::Stop()
    50. {
    51. m_Timer.stop();
    52. }
    53. #include "main.moc"
    54. int main(int argc, char **argv)
    55. {
    56. QApplication app(argc, argv);
    57. WaitingDialog *dialog = new WaitingDialog;
    58. dialog->setWindowTitle("Please wait...");
    59. QEventLoop *loop = new QEventLoop;
    60. dialog->Start(50, 150),
    61. dialog->show();
    62. //开启一个事件循环,10秒后退出
    63. QTimer::singleShot(10000, loop, SLOT(quit()));
    64. loop->exec();
    65. return 0;
    66. }

http://blog.csdn.net/small_qch/article/details/7664634