Qt 如何从exec()调用普通函数?
我有两个类:一个维护一些循环(至少2-3分钟;从QObject继承),另一个显示进度对话框(从QDialog继承)。 我想在显示对话框后立即开始循环。我的第一个解决方案是: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()作为一个
int DialogClass::exec()
{
QTimer::singleShot(0, LoopClassPointer, SLOT(start()));
return __super::exec();
}
从插槽中抛出异常存在问题。所以我考虑了一种可能性,将slotstart()
作为一个公共函数。但现在我不知道如何使它工作良好。诸如此类:
int DialogClass::exec()
{
LoopClassPointer->start();
QApplication::processEvents();
return __super::exec();
}
不要帮忙。该对话框不会出现。
对于这种情况有没有一种共同的方法
一些细节,根据问题:
看看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启动时发出信号。。。这就是你想做的吗?