Qt 进程事件

Qt process events

本文关键字:事件 进程 Qt      更新时间:2023-10-16

我有一个导出到 qml 的QString对象。在C++代码中,在更新值并发出属性的更改信号时,它不会更新它,因为线程繁忙:在这段时间里,我在 for 循环中使用成本操作。为此,我使用 QCoreApplication::processEvents() 能够在循环的每次迭代中发出延迟信号,例如:

foreach(const QVariant& item, _manifestFile) {
    setStatusString(QString("Checking file %1 of %2...").arg(currentProcessingFile++).arg(totalFilesCount));
    QCoreApplication::processEvents();  // TODO remove
    //...
}

其中setStatusString是我上面描述的QString变量的setter:

void Updater::setStatusString(const QString &statusString) {
    _statusString = statusString;
    emit statusStringChanged();
}

如何删除该processEvents()并能够发出信号?任何解决方案都值得赞赏:线程,Qt-meta对象事物等。

您应该在堆上创建类Updater的对象,并将其移动到新线程,以防止 for 循环阻塞主线程和 UI。这可以像这样完成:

updater = new Updater();
QThread * th = new QThread();
updater->moveToThread(th);
QObject::connect(th,SIGNAL(started()),updater,SLOT(OnStarted()));
QObject::connect(th,SIGNAL(finished()),updater,SLOT(OnFinished()));
QObject::connect(updater,SIGNAL(statusStringChanged(QString)),this,SLOT(updateString(QString)));
th->start();

Updater中的初始化和终止任务应分别在OnStarted()OnFinished()槽中完成。

现在,您可以使用适当的值发出信号,该值将在适当的时间内排队和处理。您可以在定时器中以一定的间隔定期发出信号,以防止发出太频繁。

最后一点是,当Updater函数位于其他线程中时,不应直接调用它。正确的方法是将函数定义为插槽,并将信号连接到该插槽,并在要调用特定函数时发出信号。