私は QML を初めて使用し、ボタンのチュートリアルを行っているときにスコープの問題に遭遇しました。私はそれを解決しましたが、そもそもコードが機能しなかった理由がわかりません:
問題
次のコードは、ボタンをホバーしたときにランタイム参照エラーを発生させます。
main_broken.qml
import QtQuick 2.0
import QtQuick.Controls 1.1
ApplicationWindow {
visible: true
width: 640
height: 480
title: qsTr("Button Tester")
Rectangle {
id: simpleButton
height: 75
width: 150
property color buttonColor: "light blue"
property color onHoverColor: "gold"
property color borderColor: "white"
onButtonClick: {
console.log(buttonLabel.text + " clicked")
}
signal buttonClick()
Text {
id: buttonLabel
anchors.centerIn: parent
text: "button label"
}
MouseArea {
id: buttonMouseArea
anchors.fill: parent
onClicked: buttonClick()
hoverEnabled: true
onEntered: parent.border.color = onHoverColor
onExited: parent.border.color = borderColor
}
color: buttonMouseArea.pressed ? Qt.darker(buttonColor, 1.5) : buttonColor
scale: buttonMouseArea.pressed ? 0.99 : 1
}
}
エラー:
qrc:///main.qml:37: ReferenceError: onHoverColor is not defined
qrc:///main.qml:38: ReferenceError: borderColor is not defined
qrc:///main.qml:37: ReferenceError: onHoverColor is not defined
qrc:///main.qml:35: ReferenceError: buttonClick is not defined
解決
次のように、プロパティ バインディングとシグナル スロットをアプリケーション ウィンドウ オブジェクトに移動するだけで解決されます。
main_fixed.qml
ApplicationWindow {
visible: true
width: 640
height: 480
title: qsTr("Button Tester")
property color buttonColor: "light blue"
property color onHoverColor: "gold"
property color borderColor: "white"
onButtonClick: {
console.log(buttonLabel.text + " clicked")
}
signal buttonClick()
//etc
質問
ApplicationWindow オブジェクトの子 Rectangle 内にプロパティ バインディングを残すことができないのはなぜですか?
四角形専用のプロパティ (色など) が必要で、ApplicationWindow のプロパティの一部 (テキスト サイズなど) を使用する場合はどうすればよいでしょうか?
私はコーディングとスタック オーバーフローが初めてです (これが私の最初の投稿です)。可能な限り明確な方法で質問をしようとしましたが、スタック オーバーフローの基準に達していない場合と、それを変更するために何をしなければならないかを教えてください。