🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Qt Creator

Qt Creatorは、Qtアプリケーションを開発するための開発統合環境(IDE)です。

Q&A

解決済

1回答

5769閲覧

C++で作った構造体の値をQMLで扱いたい

taichaso

総合スコア22

Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Qt Creator

Qt Creatorは、Qtアプリケーションを開発するための開発統合環境(IDE)です。

0グッド

0クリップ

投稿2019/09/11 07:32

編集2019/09/11 07:37

実現したいこと

QMLを用いてGUIの作成を行っています
今回行いたいこととしては動画再生ソフトを作成したいと思っています。

ListViewを用いて動画のタイトル一覧を表示し、タイトルがクリックされたときに画面を遷移して遷移先のMediaPlayerのsourceにファイルパスを入れて表示、という流れを作りたいと思っています。

発生している問題・エラーメッセージ

現在、ListViewにファイルパスを表示して遷移先のMediaPlayerに表示という流れはできているのですが
この状態から、表示されているテキストを変えたいと思っています。

今考えていたイメージとしては、構造体、またはクラスとして下記のようなデータのまとまりを持っておいて
その中から表示するテキストや送るファイルパスなどを指定できるようにしたいと思っていました。

cpp

1struct VideoInfo{ 2 QString title; // ListViewに表示されるテキスト 3 QString path; // ListViewでテキストがclickされたときに渡されるパス 4} 5

現在はこのように書いています。
※VideoPage にはMediaPlayerとVideoOutput、及び操作するためのボタンが置いてあるだけなので省略

main.cpp

cpp

1// 追加分のみ記載 2 3QString path = "/home/root/"; 4QStringList dataList; 5QStringList nameFilters; 6nameFilters.append("*.mp4"); 7 8// QMLにデータを送るためのもの 9QQmlContext *ctxt = engine.rootContext(); 10 11// ファイル情報取得 12QDirIterator it(path, nameFilters, QDir::Files, QDirIterator::Subdirectories); 13while (it.hasNext()) { 14 QString file = it.next(); 15 // リストに追加 16 dataList.append("file://" + file); 17} 18// QMLにデータを送る 19ctxt->setContextProperty("myModel", QVariant::fromValue(dataList)); 20

main.qml

qml

1 2Window{ 3 visible: true 4 width: 640 5 height: 480 6 7 StackView { 8 id: stack 9 anchors.fill: parent 10 11 Page { 12 anchors.fill: parent 13 14 ListView { 15 id: list 16 height: parent.height; width: parent.width 17 model: myModel // c++からデータの取得 18 19 delegate: Rectangle { 20 height: 25; width: parent.width - 20 21 x: 10 22 23 Text { 24 id: text 25 x: 10; y: parent.height / 2 - this.height / 2 26 text: modelData // c++から取得したデータの反映 27 } 28 MouseArea { 29 anchors.fill: parent 30 onClicked: { 31 sv_video.mdp_video.source = text.text // ここをtext.text から構造体の中の値にしたい 32 sv_video.visible = true 33 } 34 } 35 36 border.color: "black" 37 border.pixelAligned: { 5 } 38 } 39 ScrollBar.vertical: ScrollBar{} 40 } 41 42 VideoPage { 43 id: sv_video 44 visible: false 45 } 46 } 47} 48

該当のソースコード

下記のように動かしたいと考えています。

qml

1MouseArea { 2 anchors.fill: parent 3 onClicked: { 4 sv_video.mdp_video.source = text.text // ここをtext.text から構造体の中の値にしたい 5 //sv_video.mdp_video.source = 送られてきた構造体.path // イメージ 6 7 sv_video.visible = true 8 } 9}

試したこと

何件か調べてみたのですがmain.cppから値を入れるというものが少なく、参考になりそうなものがありませんでした。
なお、下記のように調べていました。

  • qml setcontextproperty struct
  • qml listview struct
  • qml listview class

補足情報(FW/ツールのバージョンなど)

Ubuntu 16.04 LTS64
Qt 5.10.1 (GCC 5.3.1 20160406 (Red Hat 5.3.1-6), 64bit)
Qt Creator 4.5.1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

C++ で QML のモデルを作る際のドキュメントはこちらになります。
Using C++ Models with Qt Quick Views

QStringList, QVariantList は1要素のリストを QML のモデルとする場合には便利ですが、それ以上の機能が必要な場合には QAbstractItemModel のサブクラスを作成するのが基本です。

モデルを Qt Creator で作成する際には以下の動画が参考になるかもしれません。
Using C++ Models in QML {tutorial}

投稿2019/09/11 07:49

tasuku.

総合スコア347

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

taichaso

2019/09/11 08:00

回答ありがとうございます。 教えていただいたドキュメントを読んだところ、たしかに私が行いたかったことと同じことが記載されていました。 一点質問がありまして、こちらのサイトのサンプルソースなどがまとまっている場所をご存知でしたら教えていただけないでしょうか。
taichaso

2019/09/11 23:39

サンプルソースとドキュメントを見て実装していこうと思います。 回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問