Qt流程事件

时间:2015-01-09 08:14:46

标签: c++ multithreading qt events emit

我有一个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对象等等。

1 个答案:

答案 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函数。正确的方法是将功能定义为插槽,并将信号连接到该插槽,并在您想要调用特定功能时发出信号。