12,925
回編集
(→動的生成方式) |
|||
334行目: | 334行目: | ||
動的生成方式において、コンポーネントを生成して、そのコンポーネントに定義したメソッドの戻り値を受け取ることもできる。<br> | 動的生成方式において、コンポーネントを生成して、そのコンポーネントに定義したメソッドの戻り値を受け取ることもできる。<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) { | ||
dynamicWindow = component.createObject(mainWindow, { | |||
"windowTitle": "New Dynamic Window", | |||
"parentWindow": mainWindow | |||
}); | |||
updateChildWindowInfo() | |||
} | } | ||
} | } | ||
} | |||
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 | |||
} | } | ||
} | } |