C ++コードと一緒にQMLUIがあります。その進行状況を示す必要がある私のループは、次のように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)
それは簡単です!ステップバイステップで行きましょう。
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
のprogressChanged
シグナルに接続します(キュー接続)。このステップは、バックグラウンドスレッドからQMLにシグナルを中継するために必要です。
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();
}
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;
}
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加