【qt】程序忙碌时的进度条

本文介绍了一种使用Qt实现无限循环进度条的方法,通过简单的代码示例展示了如何创建一个不断更新显示进度的对话框,适用于后台任务执行时的用户界面反馈。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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


截图:



源代码:

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

class WaitingDialog : public QDialog
{
	Q_OBJECT
private:
	int m_CurrentValue;			//当前值
	int m_UpdateInterval;		//更新间隔
	int m_MaxValue;				//最大值
	QTimer m_Timer;
	QProgressBar *m_ProgressBar;
public:
	WaitingDialog(QWidget *parent = 0);
	~WaitingDialog();
	void Start(int interval=100, int maxValue=100);
	void Stop();
	private slots:
		void UpdateSlot();
};

WaitingDialog::WaitingDialog(QWidget *parent)
{
	m_ProgressBar = new QProgressBar(this);
	m_CurrentValue = m_MaxValue = m_UpdateInterval = 0;
	m_ProgressBar->setRange(0, 100);
	connect(&m_Timer, SIGNAL(timeout()), this, SLOT(UpdateSlot()));
	m_ProgressBar->setTextVisible(false);
	QHBoxLayout *layout = new QHBoxLayout;
	layout->addWidget(m_ProgressBar);
	setLayout(layout);
}

WaitingDialog::~WaitingDialog()
{

}

void WaitingDialog::UpdateSlot()
{
	m_CurrentValue++;
	if( m_CurrentValue == m_MaxValue )
		m_CurrentValue = 0;
	m_ProgressBar->setValue(m_CurrentValue);
}

void WaitingDialog::Start(int interval/* =100 */, int maxValue/* =100 */)
{
	m_UpdateInterval = interval;
	m_MaxValue = maxValue;
	m_Timer.start(m_UpdateInterval);
	m_ProgressBar->setRange(0, m_MaxValue);
	m_ProgressBar->setValue(0);
}

void WaitingDialog::Stop()
{
	m_Timer.stop();
}

#include "main.moc"

int main(int argc, char **argv)
{
	QApplication app(argc, argv);
	WaitingDialog *dialog = new WaitingDialog;
	dialog->setWindowTitle("Please wait...");
	QEventLoop *loop = new QEventLoop;
	dialog->Start(50, 150), 
	dialog->show();
	//开启一个事件循环,10秒后退出
	QTimer::singleShot(10000, loop, SLOT(quit()));
	loop->exec();
	return 0;
}
reference: http://blog.youkuaiyun.com/small_qch/article/details/7664634


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值