「QMLの基礎 - ウインドウ」の版間の差分

ナビゲーションに移動 検索に移動
334行目: 334行目:
動的生成方式において、コンポーネントを生成して、そのコンポーネントに定義したメソッドの戻り値を受け取ることもできる。<br>
動的生成方式において、コンポーネントを生成して、そのコンポーネントに定義したメソッドの戻り値を受け取ることもできる。<br>
<br>
<br>
以下の例では、サブウインドウでgetWindowInfoメソッドを定義して、メインウインドウで動的に生成したサブウインドウのメソッドを実行して、戻り値を取得している。<br>
以下の例では、子ウインドウにメソッドを定義して、親ウインドウで動的に生成した子ウインドウのメソッドを実行して戻り値を取得している。<br>
<br>
<br>
ボタンを押下する時、サブウインドウが開く。<br>
親ウインドウのボタンを押下する時、子ウインドウが開く。<br>
サブウインドウのボタンを押下する時、サブウインドウを閉じてシグナルがメインウインドウに送信される。<br>
子ウインドウのボタンを押下する時、子ウインドウを閉じてシグナルが親ウインドウに送信される。<br>
<br>
この方法では、親ウインドウから子ウィンドウの関数を直接呼び出し、あるいは、子ウィンドウから親ウィンドウの関数を呼び出すことで通信を行う。<br>
シグナル / シグナルハンドラを使用しないため、コードの流れが直接的になる。<br>
<br>
<u>ただし、オブジェクト間の結合度が高くなるため、複雑なアプリケーションでは管理が難しくなる可能性があることに注意すること。</u><br>
<br>
<br>
  <syntaxhighlight lang="qml">
  <syntaxhighlight lang="qml">
353行目: 358行目:
     title:  windowTitle
     title:  windowTitle
   
   
     property string windowTitle: "Dynamic Window"
    property var    parentWindow: null
     property string windowTitle: "Dynamic Window"
    function closeWindow() {
      if (parentWindow) parentWindow.onChildWindowClosed("Window is closing")
      dynamicWindow.close()
    }
   
   
     function getWindowInfo() {
     function getWindowInfo() {
366行目: 377行目:
       anchors.centerIn: parent
       anchors.centerIn: parent
       spacing: 20
       spacing: 20
      Button {
          text: "Close Window"
          onClicked: {
            closeWindow()
          }
      }
   
   
       Button {
       Button {
371行目: 389行目:
           onClicked: {
           onClicked: {
             windowTitle = "Updated Title"
             windowTitle = "Updated Title"
            if (parentWindow) parentWindow.updateChildWindowInfo()
           }
           }
       }
       }
390行目: 409行目:
     visible: true
     visible: true
     title:  qsTr("Main Window")
     title:  qsTr("Main Window")
    property var dynamicWindow: null
   
   
     Column {
     Column {
400行目: 421行目:
             var component = Qt.createComponent("DynamicWindow.qml");
             var component = Qt.createComponent("DynamicWindow.qml");
             if (component.status === Component.Ready) {
             if (component.status === Component.Ready) {
                 var dynamicWindow = component.createObject(mainWindow, {"windowTitle": "New Dynamic Window"});
                 dynamicWindow = component.createObject(mainWindow, {
                  "windowTitle": "New Dynamic Window",
                 // メソッドの実行および戻り値の取得
                  "parentWindow": mainWindow
                var windowInfo = dynamicWindow.getWindowInfo();
                 });
                 console.log("Window Info:", JSON.stringify(windowInfo));
                 updateChildWindowInfo()
                infoText.text  = "Window Info: " + JSON.stringify(windowInfo);
             }
             }
           }
           }
      }
      Button {
          text: "Update Window Info"
          enabled: dynamicWindow !== null
          onClicked: updateChildWindowInfo()
      }
      Text {
          id: statusText
          text: "No window closed yet"
       }
       }
   
   
414行目: 445行目:
           text: "No window info yet"
           text: "No window info yet"
       }
       }
    }
    function updateChildWindowInfo() {
      if (dynamicWindow) {
          var windowInfo = dynamicWindow.getWindowInfo()
          console.log("Updated Window Info:", JSON.stringify(windowInfo))
          infoText.text  = "Window Info: " + JSON.stringify(windowInfo)
      }
    }
    function onChildWindowClosed(message) {
      console.log("Child window closed:", message)
      statusText.text = "Last closed: " + message
      dynamicWindow  = null
     }
     }
  }
  }

案内メニュー