Qtで作るAndroid目覚ましもどきの第五話です。
-
やりたいこと
目覚ましのときに使用する音声ファイル(画像ファイル)を選択できる機能(音声設定機能)の実現 -
やること/今回のテーマ
- JSONファイルの読み書き
- c++とQMLとの間のコンテキストの共有
このプロジェクトの構成については気になる人は第一話の記事を見てください。
JSONファイルの読み書き
Qt、特にQMLの部分はJavascriptがベースになっているせいかJSONファイルの扱いに強いです。varでとりあえずJSONオブジェクトが使える。なのでQMLとc++を共同して操作する情報はJSONでやるのが良い気がします。
しかしQtのc++はJSONファイルの読み書きがちょっとめんどいです。
……とうんちくたれようかと思いましたが下記ページを見つけたので参照してください。
(若干私の書き方と違いますが)
QJsonDocumentとQJsonObjectを使って、JSON形式で読み書きする方法
余談:INIファイルの読み書き
QtはQSettingsクラスを使ってINIファイルも使えます。
QSettings Classのリファレンスを見ると簡単そう。
きっとJSONの方が色々できるとは思いますが、簡単な設定情報をc++で管理するだけならINIファイルを使った方が良いかもと気付きました。
QMLではSettings型オブジェクトを使うようです。
c++とQMLとの間のコンテキストの共有
必要な時に互いのインターフェースにJSONオブジェクトを渡しても良かったのですが、渡すオブジェクトが決まってるのにそれをやるのはバカらしく感じて、コンテキストとしてJSONオブジェクトを共有してみることにしました。
やり方ですが、まず、main()として動くc++からQMLにsetContextProperty()でJSONオブジェクトを設定します。setContextProperty()とはリファレンスでは
void QQmlContext::setContextProperty(const QString &name, QObject *value)
Set the context object.
"コンテキスト・オブジェクトを設定する"という短い説明がされています。
まあ正式な詳細説明がどこにあるのか知りませんが、setContextProperty()は第二引数で与えられたオブジェクトをQML上で第一引数の文字列の名前のオブジェクトないしはプロパティとして使えるようにする、というもののようで。第二引数の型は一応QObjectというクラスですが、QObjectを継承したクラスとかQtのクラスならだいたいがむぎゅっと第二引数に入れられそうです。
で、改めてぐぐると下記記事を発見しました。
QMLとC++のバインディング
私がいう共有とは、他方で変えられれば他方にもそれが反映されるということで、バインディングという言い方になるわけですね。
やり方も上記記事のとおりで、さらにいろいろ書いてあるので是非今後の参考にしたい記事でした。