Armadilloフォーラム

Qt Quick(QML)画面のC++からの切り替え制御について

k.nishijo

2018年3月19日 14時49分

お世話になります。

掲題の件について質問いたします。

ネットでいろいろ調べた結果、
Qt Quick(QML)で作成した画面を切り替えるには、Stateを使用するということまでは分かったのですが、
それを画面以外の処理(C++側)からなにかしらの制御を検出して(例えば、Armadilloのユーザーボタン押下?)それをトリガとして切り替える方法(state:を変化させる方法)がわかりません。
そのようなことは可能なのでしょうか?

参考になるURL等がありましたらご教示ください。

コメント

at_ohsawa

2018年3月19日 15時13分

>(state:を変化させる方法)がわかりません。
> そのようなことは可能なのでしょうか?

こちら参考になるでしょうか。自分で代入すれば遷移します。

Qt Quick 入門 第5回: 状態遷移
http://blog.qt.io/jp/2010/10/27/qml-states-2/

上の例だと、widget内のMouseAreaに対して発生したクリックを
onClickハンドラで検知して、ハンドラ内の処理をstateの代入としています。

MouseAreaで利用できる他のハンドラはリファレンスマニュアルを参照してください。
http://doc.qt.io/qt-5/qml-qtquick-mousearea.html

他にもキーボードであればKeysが使えます。
こちらもリファレンスマニュアルにサンプルがあります。
http://doc.qt.io/qt-5/qml-qtquick-keys.html

あるいは、Armadilloのユーザーボタンは標準イメージであれば
gpio-keyデバイスドライバによってキーボードのキーと同じように
扱うことができるので、同様に、Keysのハンドラによって
イベントを獲得できると思います。

Armadillo-840開発セット 拡張ボード01のユーザースイッチが発生させる
キーコードは下記参照してください。
参考: Armadillo-840 製品マニュアル 6.10. ユーザースイッチ 
https://manual.atmark-techno.com/armadillo-840/armadillo-840_product_ma…

k.nishijo

2018年3月19日 16時49分

本件、QMLの画面遷移をQML内ではなくC++で外から制御することは可能でしょうか?

> >(state:を変化させる方法)がわかりません。
> > そのようなことは可能なのでしょうか?
>
> こちら参考になるでしょうか。自分で代入すれば遷移します。
>
> Qt Quick 入門 第5回: 状態遷移
> http://blog.qt.io/jp/2010/10/27/qml-states-2/
>
> 上の例だと、widget内のMouseAreaに対して発生したクリックを
> onClickハンドラで検知して、ハンドラ内の処理をstateの代入としています。
>
> MouseAreaで利用できる他のハンドラはリファレンスマニュアルを参照してください。
> http://doc.qt.io/qt-5/qml-qtquick-mousearea.html
>
> 他にもキーボードであればKeysが使えます。
> こちらもリファレンスマニュアルにサンプルがあります。
> http://doc.qt.io/qt-5/qml-qtquick-keys.html
>
> あるいは、Armadilloのユーザーボタンは標準イメージであれば
> gpio-keyデバイスドライバによってキーボードのキーと同じように
> 扱うことができるので、同様に、Keysのハンドラによって
> イベントを獲得できると思います。
>
> Armadillo-840開発セット 拡張ボード01のユーザースイッチが発生させる
> キーコードは下記参照してください。
> 参考: Armadillo-840 製品マニュアル 6.10. ユーザースイッチ 
> https://manual.atmark-techno.com/armadillo-840/armadillo-840_product_ma…
>

at_ohsawa

2018年3月19日 17時12分

>
> 本件、QMLの画面遷移をQML内ではなくC++で外から制御することは可能でしょうか?

そのままなチュートリアルがあります。QQmlPropertyで直接書き換えるか、
QMLにシグナルハンドラを書いておいて、 QObject::connectで繋いで、
シグナルを伝える等できると思います。
http://doc.qt.io/qt-5/qtqml-cppintegration-interactqmlfromcpp.html

QQmlPropertyを使わなくてもqml engine自体のオブジェクト内には
QMLの構造がそのまま入っているので、探して書き換える事もできるみたいです。
https://forum.qt.io/topic/67380/c-find-child-qml-item-included-from-oth…

k.nishijo

2018年3月20日 11時05分

確認できました。
ありがとうございました。

> >
> > 本件、QMLの画面遷移をQML内ではなくC++で外から制御することは可能でしょうか?
>
> そのままなチュートリアルがあります。QQmlPropertyで直接書き換えるか、
> QMLにシグナルハンドラを書いておいて、 QObject::connectで繋いで、
> シグナルを伝える等できると思います。
> http://doc.qt.io/qt-5/qtqml-cppintegration-interactqmlfromcpp.html
>
> QQmlPropertyを使わなくてもqml engine自体のオブジェクト内には
> QMLの構造がそのまま入っているので、探して書き換える事もできるみたいです。
> https://forum.qt.io/topic/67380/c-find-child-qml-item-included-from-oth…