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

Qt 如何从exec()调用普通函数?,qt,exec,progressdialog,qdialog,Qt,Exec,Progressdialog,Qdialog,我有两个类:一个维护一些循环(至少2-3分钟;从QObject继承),另一个显示进度对话框(从QDialog继承)。 我想在显示对话框后立即开始循环。我的第一个解决方案是: int DialogClass::exec() { QTimer::singleShot(0, LoopClassPointer, SLOT(start())); return __super::exec(); } 从插槽中抛出异常存在问题。所以我考虑了一种可能性,将slotstart()作为一个

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

 int DialogClass::exec()
 {
     QTimer::singleShot(0, LoopClassPointer, SLOT(start()));
     return __super::exec();
 }
从插槽中抛出异常存在问题。所以我考虑了一种可能性,将slot
start()
作为一个公共函数。但现在我不知道如何使它工作良好。诸如此类:

int DialogClass::exec()
{
     LoopClassPointer->start();
     QApplication::processEvents();
     return __super::exec();
}
不要帮忙。该对话框不会出现。 对于这种情况有没有一种共同的方法

一些细节,根据问题:

  • 我必须使用具有自己风格的系统,所以我们在创建任何对话框时都有一种通用的方法:从stytle类继承它们,stytle类是从QDialog继承的

  • 我的“LoopClassPointer”是从单独的dll导出的类(其中没有UI支持)

  • 我在主应用程序中有一个“开始”按钮,它与一个插槽相连,可以创建进度对话框和“LoopClassPointer”。目前,我在对话框中发送'LoopClassPointer'实例,不需要对体系结构进行重大更改


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


    e、 g.在Qt4.8中:

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

    从QObject派生worker类非常好,因为这意味着您可以在单独的线程上启动它:-

    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的使用,那么从阅读开始


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

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