現在私は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 HOME | OS | 20H2 | 特になし |
GNU G++ | C++用コンパイラ | 8.1.0 | Qt(oss版) オンラインインストーラよりインストール |
Ninja | ビルドツール | 1.10.0 | Qt(oss版) オンラインインストーラよりインストール |
CMake | メタビルドツール | 3.19.2 | Qt(oss版) オンラインインストーラよりインストール |
Qt | ライブラリ | 6.0.3 | Qt(oss版) オンラインインストーラよりインストール |
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2021/04/21 10:12