我有一个QString
对象导出到qml。在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
变量的位置:
void Updater::setStatusString(const QString &statusString) {
_statusString = statusString;
emit statusStringChanged();
}
如何删除processEvents()
并能够发出信号?任何解决方案都值得赞赏:线程,Qt-meta对象等等。
答案 0 :(得分:0)
您应该在堆上创建类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
函数。正确的方法是将功能定义为插槽,并将信号连接到该插槽,并在您想要调用特定功能时发出信号。