谢谢指导
我改了代码,您看看是否有问题
主要是把耗时操作放到次线程里,把更新进度条放到主线程里,同时在更新后运行 QApplication::processEvents();
我觉得这两个操作对cpu谁会占用多一些呢?还是一样多,能达到那种平滑的效果吗?
//ThreadWorker.h
#include <QObject>
class ThreadWorker : public QObject
{
Q_OBJECT
public:
ThreadWorker() {}
~ThreadWorker() {}
public slots:
void onProgressBarRun()
{
qDebug()<<"onProgressBarRun: "<<QThread::currentThreadId();
QTime t;
t.start();
while(t.elapsed() < 3000)
{
}
}
signals:
void updateProgressBar(int);
};
//Widget.h
#include <QWidget>
#include <QApplication>
#include <QGridLayout>
#include <QProgressBar>
#include <QPushButton>
#include "ThreadWorker.h"
class Widget:public QWidget
{
Q_OBJECT
public:
Widget();
~Widget();
signals:
void startProgressBar();
private slots:
void setProgressBar(int i);
void onButtonClicked();
private:
QGridLayout *m_mainLayout;
QProgressBar *m_progressBar;
ThreadWorker *m_threadWorker;
QThread *m_thread;
QPushButton *m_button;
};
Widget.cpp
#include <Widget.h>
Widget::Widget()
{
m_mainLayout = new QGridLayout;
m_progressBar = new QProgressBar;
m_progressBar->setRange(0, 2000 - 1);
m_progressBar->setValue(0);
m_mainLayout->addWidget(m_progressBar, 0, 0);
m_button = new QPushButton("button");
m_mainLayout->addWidget(m_progressBar, 1, 0);
setLayout(m_mainLayout);
m_threadWorker = new ThreadWorker;
m_thread = new QThread(this);
m_threadWorker->moveToThread(m_thread);
connect(m_button, SIGNAL(clicked()), SLOT(onButtonClicked()));
connect(this, SIGNAL(startProgressBar()), m_threadWorker, SLOT(onProgressBarRun()));
connect(m_threadWorker, SIGNAL(updateProgressBar(int)), this, SLOT(setProgressBar(int)));
m_thread->start();
}
Widget::~Widget()
{
if(m_mainLayout != NULL)
{
delete m_mainLayout;
m_mainLayout = NULL;
}
if(m_threadWorker != NULL)
{
delete m_threadWorker;
m_threadWorker = NULL;
}
if(m_thread != NULL)
{
//m_thread->quit();
delete m_thread;
m_thread = NULL;
}
}
void Widget::onButtonClicked()
{
emit startProgressBar();//发送信号,执行线程onProgressBarRun槽,运行耗时操作
for(int i = 0; i < 2000; i++) //更新进度条
{
for(int j = 0; j < 2000; j++) {}
m_progressBar->setValue(i);
QApplication::processEvents();
}
}
void Widget::setProgressBar(int i)
{
m_progressBar->setValue(i);
QApplication::processEvents();
}
[ 此帖被maidisula在2011-04-20 11:29重新编辑 ]