QML中的进度条实现,以显示C ++中循环的进度

时间:2018-11-13 12:06:46

标签: c++ qt qml

我在我的C ++代码旁有我的QML UI。我需要显示其进度的循环是用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 :(得分:3)

很简单!让我们一步一步来。

  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的{​​{1}}信号(排队连接)。必须执行此步骤才能将信号从后台线程中继到QML。

  4. 将C ++类链接到QML:

    progressChanged
  5. 收听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();
    }