我在我的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)
答案 0 :(得分:3)
很简单!让我们一步一步来。
您的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);
};
启动后台线程并定义其自己的progressChanged
信号。
for(unsigned int j = 0; j < Count; ++j) {
// Do stuff
emit progressChanged(/*current progress*/);
}
将后台线程的progressChanged
连接到主线程活动对象Worker
的{{1}}信号(排队连接)。必须执行此步骤才能将信号从后台线程中继到QML。
将C ++类链接到QML:
progressChanged
收听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();
}