如何从exec()调用普通函数?

时间:2013-12-16 08:44:26

标签: qt exec progressdialog qdialog

我有两个类:一个维护一些循环(leas 2-3分钟;并且从QObject继承),另一个显示进度对话框(继承自QDialog)。 我想在显示对话框后立即启动循环。我的第一个解决方案是:

 int DialogClass::exec()
 {
     QTimer::singleShot(0, LoopClassPointer, SLOT(start()));
     return __super::exec();
 }

从插槽中抛出异常存在问题。所以我考虑过将公共广告位start()作为公共函数的可能性。但现在我不知道如何让它运作良好。这样的事情:

int DialogClass::exec()
{
     LoopClassPointer->start();
     QApplication::processEvents();
     return __super::exec();
}

没有帮助。该对话框不会出现。 对这种情况有共同的方法吗?

一些细节,根据问题:

  1. 我必须使用具有自己样式的系统,因此我们在创建任何对话框时都有一个共同的方法:从继承自QDialog的stytle类继承它们。

  2. 我的'LoopClassPointer'是来自单独dll的导出类(其中没有UI支持)。

  3. 我在主应用程序中有一个“开始”按钮,它与一个插槽连接,创建了进度对话框和'LoopClassPointer'。目前我在对话框中发送'LoopClassPointer'实例,并且不想对架构进行重大更改。

2 个答案:

答案 0 :(得分:0)

查看QtDemo-> Concurrent Programming-> Run function

e.g。在Qt 4.8:http://qt-project.org/doc/qt-4.8/qtconcurrent-runfunction.html

答案 1 :(得分:0)

在这种情况下,我建议您将循环逻辑与对话框分开。 Gui元素应该始终保持独立。

你的worker类是从QObject派生的,这很好,因为这意味着你可以在一个单独的线程上运行它: -

QThread* m_pWorkerThread = new QThread;
Worker* m_pWorkerObject  = new Worker; // assuming this object runs the loop mentioned

// Qt 5 connect syntax
connect(m_pWorkerThread, &QThread::started, m_pWorkerObject, &WorkerObject::start);
connect(m_pWorkerThread, &QThread::finished, m_pWorkerThread, &QThread::deleteThis);

m_pWorkerObject->moveToThread(m_pWorkerThread);
m_pWorkerThread->start();

如果您不熟悉使用QThread,请先阅读this

您需要的唯一其他事情是定期从您的工作对象发送信号并继续工作,并将其连接到对话框中的插槽,该插槽会更新其显示的进度。