Реализация индикатора выполнения в QML, чтобы показать прогресс цикла в C ++ - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть мой QML UI вместе с моим кодом C ++.Мой цикл, который мне нужен, чтобы показать его прогресс, разработан в C ++ следующим образом:

for(unsigned int j = 0; j < Count; ++j) {
    // Do stuff
}

В моем коде QML мне нужно индикатор выполнения, например:

ProgressBar {
    value: j  // Should come from C++ loop
              // It is "j" on C++ loop
    from: 0   // C++ loop starts out with 0
    to: Count // C++ loop ends with "Count"
}

Я неНе знаю, как мой цикл C ++ и мой индикатор выполнения QML должны быть связаны друг с другом.Я не смог найти ни одного соответствующего примера .Кто-нибудь может дать мне подсказку.


Связь между моим C ++ и QML осуществляется с помощью Q_PROPERTY, как это, но я не уверен, как его использовать:

Q_PROPERTY(float j READ j WRITE setJ NOTIFY jChanged)

1 Ответ

0 голосов
/ 13 ноября 2018

Это просто! пойдем шаг за шагом.

  1. Ваш класс C ++ должен расширять QObject и использовать макрос Q_OBJECT внутри. Я называю это Worker например.

    class Worker : public QObject
    {
        Q_OBJECT
        Q_PROPERTY(float progress READ progress NOTIFY progressChanged)
    public:
        Q_INVOKABLE void start() {
            // start the worker thread in which your loop spins
        }
        float progress(); // progress getter
    signals:
        void progressChanged(float progress);
    };
    
  2. Запустить фоновый поток и определить собственный сигнал progressChanged.

    for(unsigned int j = 0; j < Count; ++j) {
        // Do stuff
        emit progressChanged(/*current progress*/);
    }
    
  3. Подключите фоновый поток progressChanged к живому объекту основного потока Worker сигнал progressChanged (подключение в очередь). Этот шаг необходим для передачи сигналов из фонового потока в QML.

  4. Ссылка класса C ++ на QML:

    int main(int argc, char *argv[]) {
        QGuiApplication app(argc, argv);
    
        QQuickView view;
        Worker w;
        view.engine()->rootContext()->setContextProperty("worker", &w);
        view.setSource(QUrl::fromLocalFile("MyItem.qml"));
        view.show();
    
        return app.exec();
    }
    
  5. Прослушивание сигнала на стороне QML:

    ProgressBar {
        id: prg
        from: 0   // C++ loop starts out with 0
        to: Count // C++ loop ends with "Count"
    
        Connections {
            target: worker
            onProgressChanged: prg.value = progress;
        }
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...