0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

QtにおけるJSONなどの扱い - Qtで作るAndroid目覚ましもどき #5 -

0
Last updated at Posted at 2018-01-07

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++のバインディング
私がいう共有とは、他方で変えられれば他方にもそれが反映されるということで、バインディングという言い方になるわけですね。
やり方も上記記事のとおりで、さらにいろいろ書いてあるので是非今後の参考にしたい記事でした。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?