質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
Qt

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

Q&A

解決済

2回答

3271閲覧

qml中の共通部分をまとめたい。

退会済みユーザー

退会済みユーザー

総合スコア0

Qt

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

0グッド

0クリップ

投稿2021/04/20 09:46

現在私はQt Quickを用いて
スライドインアニメーションを実装しようとしており、
このサイトを参考に下記コード1,2,3のように書いてみて
狙い通りの挙動(下記本コードの挙動を参照)で動いたのですが
コード2とコード3の内容がLabelエレメント以外ほぼ同じなので
共通の部分のみほかのファイルに記載してコードの量を減らしたいのですが
どのようなqmlエレメントを使えば抽象化のような事ができるのでしょうか。

ご回答よろしくお願いいたします。

備考
下記3つのファイルはすべて同じフォルダに配置して下さい。

コード1: 基底ウィンドウを記したmain.qml

qml

1import QtQuick 2.15 2import QtQuick.Window 2.2 3import QtQuick.Controls 2.15 4 5Window{ 6 visible: true 7 title: qsTr("Qt Quick") 8 id: root 9 10 width: 500 11 height: 400 12 13 SubWindow_1{ 14 id: window1 15 state: "element_show" 16 } 17 18 SubWindow_2{ 19 id: window2 20 } 21 22 MouseArea{ 23 anchors.fill: parent 24 25 onClicked:{ 26 if(window1.is_show()){ 27 window1.hide() 28 window2.show() 29 }else{ 30 window1.show() 31 window2.hide() 32 } 33 } 34 } 35}

コード2: 1つ目のサブウィンドウを記したSubWindow_1.qml

qml

1import QtQuick 2.9 2import QtQuick.Controls 2.15 3 4Rectangle{ 5 /*-------------------- 6 その他プロパティ 7 *///------------------ 8 id: window1 9 color: "white" 10 border.width: 5 11 state: "element_hide" 12 width: parent.width 13 height: parent.height 14 15 /*------------------ 16 描画する内容 17 *///---------------- 18 Label{ 19 id: label 20 text: qsTr("サブウィンドウ_1") 21 22 horizontalAlignment: Qt.AlignHCenter 23 verticalAlignment: Qt.AlignVCenter 24 25 fontSizeMode: Text.Fit 26 minimumPointSize: 1 27 font.pointSize: 1000 28 width: parent.width 29 height: parent.height 30 } 31 32 /*-------------- 33 状態定義 34 *///------------ 35 states:[ 36 State{ 37 name: "element_hide" 38 PropertyChanges{target: window1; x: window1.width; y: 0} 39 }, 40 41 State{ 42 name: "element_show" 43 PropertyChanges{target: window1; x: 0; y: 0} 44 } 45 ] 46 47 /*------------------------ 48 アニメーション定義 49 *///---------------------- 50 transitions:[ 51 Transition{ 52 to: "element_hide" 53 NumberAnimation{properties: "x,y"; easing.type: Easing.InOutQuad; duration: 250} 54 }, 55 56 Transition{ 57 to: "element_show" 58 NumberAnimation{properties: "x,y"; easing.type: Easing.InOutQuad; duration: 250} 59 } 60 ] 61 62 /*-------------- 63 関数定義 64 *///------------ 65 function hide(){ 66 window1.state = "element_hide" 67 } 68 69 function show(){ 70 window1.state = "element_show" 71 } 72 73 function is_show(){ 74 return window1.state === "element_show" 75 } 76}

コード3: 2つ目のサブウィンドウを記したSubWindow_2.qml

qml

1import QtQuick 2.9 2import QtQuick.Controls 2.15 3 4Rectangle{ 5 /*-------------------- 6 その他プロパティ 7 *///------------------ 8 id: window2 9 color: "white" 10 border.width: 5 11 state: "element_hide" 12 width: parent.width 13 height: parent.height 14 15 /*------------------ 16 描画する内容 17 *///---------------- 18 Label{ 19 id: label 20 text: qsTr("サブウィンドウ_2") 21 22 horizontalAlignment: Qt.AlignHCenter 23 verticalAlignment: Qt.AlignVCenter 24 25 fontSizeMode: Text.Fit 26 minimumPointSize: 1 27 font.pointSize: 1000 28 width: parent.width 29 height: parent.height 30 } 31 32 /*-------------- 33 状態定義 34 *///------------ 35 states:[ 36 State{ 37 name: "element_hide" 38 PropertyChanges{target: window2; x: window2.width; y: 0} 39 }, 40 41 State{ 42 name: "element_show" 43 PropertyChanges{target: window2; x: 0; y: 0} 44 } 45 ] 46 47 /*------------------------ 48 アニメーション定義 49 *///---------------------- 50 transitions:[ 51 Transition{ 52 to: "element_hide" 53 NumberAnimation{properties: "x,y"; easing.type: Easing.InOutQuad; duration: 250} 54 }, 55 56 Transition{ 57 to: "element_show" 58 NumberAnimation{properties: "x,y"; easing.type: Easing.InOutQuad; duration: 250} 59 } 60 ] 61 62 /*-------------- 63 関数定義 64 *///------------ 65 function hide(){ 66 window2.state = "element_hide" 67 } 68 69 function show(){ 70 window2.state = "element_show" 71 } 72 73 function is_show(){ 74 return window2.state === "element_show" 75 } 76}

本コードの挙動

サブウィンドウ1とサブウィンドウ2があり
画面クリックでそれぞれが入れ替わる。
イメージ説明

開発環境の備考

ソフトウェア名種類バージョン備考
Windows10 HOMEOS20H2特になし
GNU G++C++用コンパイラ8.1.0Qt(oss版) オンラインインストーラよりインストール
Ninjaビルドツール1.10.0Qt(oss版) オンラインインストーラよりインストール
CMakeメタビルドツール3.19.2Qt(oss版) オンラインインストーラよりインストール
Qtライブラリ6.0.3Qt(oss版) オンラインインストーラよりインストール

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

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

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

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

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

guest

回答2

0

ベストアンサー

teamikl さんの回答のように、共通部分を SubWindow.qml というファイルに実装することで、
SubWindow というエレメントして扱うことができるので、共通の機能を SubWindow に実装して、それを外(もしくは派生エレメント)から変更するのが普通かなと思います。

質問の内容自体とは少し離れますが、実現したいことを察するに
Qt Quick Controls 2 というモジュールに含まれる StackView エレメントの利用も視野にいれるのがいいかなと思います。
https://doc.qt.io/qt-6/qml-qtquick-controls2-stackview.html

投稿2021/04/21 02:16

tasuku.

総合スコア347

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

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

退会済みユーザー

退会済みユーザー

2021/04/21 10:12

tasuku.さん StackViewに関して初耳だったので少し調べてみてとても便利そうだったので ウィンドウごとに違うファイルに記載して行き、 main.qml内でStackViewを使用してそれらウィンドウを 呼び出す、という方針で進めて行こうと思います。 あと回答依頼にお答えいただきとても光栄に感じております。 ご回答誠にありがとうございました。
guest

0

どのようなqmlエレメントを使えば抽象化のような事ができるのでしょうか。

プロパティにすることで、外部・利用側で差分を記述できます。

ラベルのみプロパティにした例。

qml

1// main.qml (差分のみ) 2 3 SubWindow { 4 id: window1 5 state: "element_show" 6 7 title: "サブウィンドウ_1" 8 } 9 10 SubWindow { 11 id: window2 12 title: "サブウィンドウ_2" 13 }

qml

1// SubWindow.qml (差分のみ) 2 3 property string title: "サブウィンドウ" 4 5 6 // 描画する内容 7 Label { 8 id: label 9 text: title 10 11 ... 12 } 13 14

関数定義~の部分の違いは、ID 部分が違うのみなので
同じ関数をそのまま使えます。

id は、そのファイル内でのみ有効な識別子なので、
SubWindow.qml 内でのid の区別は必要ありません。

投稿2021/04/20 10:50

編集2021/04/20 10:51
teamikl

総合スコア8760

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

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

退会済みユーザー

退会済みユーザー

2021/04/21 10:12

teamikiさん > プロパティにすることで、外部・利用側で差分を記述できます サンプルコードまでつけていただきありがとうございます。 テキストや数値などのみ変更できるようにしたいのならこちらのほうが シンプルに記述できそうですが内部で扱うカスタムエレメント を変更できるように作りたい場合 tasuku.さんが提案してくださった StackViewエレメントのほうが有効そうだなと感じたので そちらの方法を使う方針で進めていこうと思います。 > SubWindow.qml 内でのid の区別は必要ありません。 stateはRectangle内で使うプロパティなので同じステート内 の関数ではidで区別しなくてよいというわけですね 気づきませんでした... ご回答誠にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問