QT如何处理耗时的操作
请问下如果在QT里面处理耗时的操作,以前我的做法是开一个线程去处理,但是QT在QWidget下面怎么开一个线程呢?我还要在线程控制UI界面该如何处理,求大神给一个可用的代码,感激
[解决办法]
建立一个线程来处理耗时的工作其实算是比较普遍的问题,但实际操作起来比较棘手。
这里给楼主一些简单的操作步骤:
1、建立一个工作类,派生于QObject,比如:Worker,用于执行耗时操作:
class Worker : public QObject
{
Q_OBJECT
public slots:
// 长时间的作业
void doWork()
{
// ...
emit progress("正在...");
// ...
// 通知当前线程退出,即投递一个退出事件
QThread::currentThread()->quit();
}
// ...
signals:
void progress(const QString &text); // 进度
// ...
};
class Launcher : public QThread
{
Q_OBJECT
protected:
void run()
{
exec(); // 执行事件循环
}
public:
void launchWorker(Worker *worker)
{
// 初始化worker
// ...
worker->moveToThread(this); // 把worker移动到当前线程
start(); // 启动线程
}
};
Launcher launcher;
Worker *worker = new Worker;
connect(worker, SIGNAL(progress(QString)), mainWindow, SLOT(updateProgress(QString)), Qt::QueuedConnection);
launcher.launchWorker(worker);
QMetaObject::invokeMethod(worker, "doWork", Qt::QueuedConnection);
launcher.wait();
delete worker;