【问题标题】:How to call plain function from exec()?如何从 exec() 调用普通函数?
【发布时间】:2013-12-16 08:44:25
【问题描述】:

我有 2 个类:一个维护一些循环(至少 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。

  2. 我的“LoopClassPointer”是从单独的 dll 导出的类(其中不支持 UI)。

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

【问题讨论】:

  • __super 是什么意思?您是否尝试访问由编译器创建和保留的对象?
  • 不应该是其他方式吗?进程一开始就应该显示进度对话框?
  • 这些对象是否都在同一个线程中运行?在您的代码中,不清楚您要做什么。不同对象之间通信的方式是将信号连接到插槽。因此,您会将 obj1 的一些信号连接到 obj2 中的一个插槽,并在 obj1 启动时发出信号……这就是您想要做的吗?

标签: qt exec progressdialog qdialog


【解决方案1】:

看看QtDemo->并发编程->运行函数

例如在 Qt 4.8 中:http://qt-project.org/doc/qt-4.8/qtconcurrent-runfunction.html

【讨论】:

    【解决方案2】:

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

    很高兴您的工作类是从 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 开始。

    您唯一需要的另一件事是定期从您的工作对象发送信号及其工作进度,并将其连接到对话框中的插槽,从而更新其进度显示。

    【讨论】:

      猜你喜欢
      • 2011-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-27
      • 1970-01-01
      相关资源
      最近更新 更多