现在的位置: 首页 > 综合 > 正文

QT:程序忙碌时的进度条

2012年11月19日 ⁄ 综合 ⁄ 共 1537字 ⁄ 字号 评论关闭

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

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

截图:

源代码:

#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;
}

抱歉!评论已关闭.