у меня есть QString
объект, который экспортируется в qml. В C++
Код, обновляя значение и отправляя измененный сигнал для свойства, не обновляет его, потому что поток занят: в то время я использую операцию cost в цикле 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 и т. Д.
Вы должны создать свой объект класса Updater
в куче и переместите его в новый поток, чтобы цикл for не блокировал основной поток и пользовательский интерфейс. Это можно сделать так:
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
функционирует напрямую, когда он находится в другом потоке. Правильный способ — определить функции как слоты и подключить сигнал к этому слоту и подать сигнал, когда вы хотите вызвать определенную функцию.