Qt ReferenceError:未在SpinBox QML中定义down

Qt ReferenceError:未在SpinBox QML中定义down,qt,qml,qtquick2,qt-quick,qtquickcontrols,Qt,Qml,Qtquick2,Qt Quick,Qtquickcontrols,我引用并复制粘贴了相同的代码,但出现以下错误: 参考错误:未定义向下和 引用错误:未定义up。 代码: 我应该包括任何其他导入吗?不,您不需要包括任何其他导入。只是,该示例使用了不好的做法,在这里您可以看到原因: 这是示例的(简化为仅修改up.indicator)代码: import QtQuick 2.6 import QtQuick.Controls 2.0 SpinBox { id: control value: 50 editable: true up

我引用并复制粘贴了相同的代码,但出现以下错误:

参考错误:未定义向下引用错误:未定义up。

代码:


我应该包括任何其他导入吗?

不,您不需要包括任何其他导入。只是,该示例使用了不好的做法,在这里您可以看到原因:

这是示例的(简化为仅修改up.indicator)代码:

import QtQuick 2.6
import QtQuick.Controls 2.0

SpinBox {
    id: control
    value: 50
    editable: true

    up.indicator: Rectangle {
        x: control.mirrored ? 0 : parent.width - width
        height: parent.height
        implicitWidth: 40
        implicitHeight: 40
        color: up.pressed ? "#e4e4e4" : "#f6f6f6"  // <---*
        border.color: enabled ? "#21be2b" : "#bdbebf"

        Text {
            text: "+"
            font.pixelSize: control.font.pixelSize * 2
            color: "#21be2b"
            anchors.fill: parent
            fontSizeMode: Text.Fit
            horizontalAlignment: Text.AlignHCenter
            verticalAlignment: Text.AlignVCenter
        }
    }
}
up来自哪里?首先,它将查看使用它的对象-
矩形
矩形
没有
向上
-属性,因此它将继续并查找文件的根节点,即
旋转框
-它有一个
向上
-属性,该属性也有一个
按下
的值

当我们尝试使用它(错误的方式)时,情况看起来就不同了。让我们添加一个
应用程序窗口

import QtQuick 2.7
import QtQuick.Window 2.2
import QtQuick.Controls 2.0

ApplicationWindow {
    id: window

    width: 800
    height: 600
    visible: true

    SpinBox {
        id: control
        value: 50
        editable: true

        up.indicator: Rectangle {
            x: control.mirrored ? 0 : parent.width - width
            height: parent.height
            implicitWidth: 40
            implicitHeight: 40
            color: up.pressed ? "#e4e4e4" : "#f6f6f6"
            border.color: enabled ? "#21be2b" : "#bdbebf"

            Text {
                text: "+"
                font.pixelSize: control.font.pixelSize * 2
                color: "#21be2b"
                anchors.fill: parent
                fontSizeMode: Text.Fit
                horizontalAlignment: Text.AlignHCenter
                verticalAlignment: Text.AlignVCenter
            }
        }
    }
}
同一行-将尝试在
矩形中查找
up
,失败并继续查找文件根节点,该节点现在是
应用程序窗口
。在这里,它又失败了。由于
ApplicationWindow
未在可能存在另一个文件根节点的另一个文件中使用,搜索将结束并最终失败

出了什么问题?该示例的作者错过了应用始终使用完全限定标识符的良好实践的步骤:
id.property….
,例如,他定义了
矩形的
x
-值

更改行:

color: up.pressed ? [...]
致:

将解决这个问题,因为我们现在明确声明在哪里查找属性
up

重要课程

  • 名称不是通过从子节点到父节点来解析的,而是始终从子节点到文件根节点,依此类推,直到无法继续解析为止
  • 始终通过
    父对象
    (但请注意,您可能不知道父对象到底是什么。因此理想情况下,仅针对锚点和位置)或通过对象的
    id

不,您不需要包括任何其他导入。只是,该示例使用了不好的做法,在这里您可以看到原因:

这是示例的(简化为仅修改up.indicator)代码:

import QtQuick 2.6
import QtQuick.Controls 2.0

SpinBox {
    id: control
    value: 50
    editable: true

    up.indicator: Rectangle {
        x: control.mirrored ? 0 : parent.width - width
        height: parent.height
        implicitWidth: 40
        implicitHeight: 40
        color: up.pressed ? "#e4e4e4" : "#f6f6f6"  // <---*
        border.color: enabled ? "#21be2b" : "#bdbebf"

        Text {
            text: "+"
            font.pixelSize: control.font.pixelSize * 2
            color: "#21be2b"
            anchors.fill: parent
            fontSizeMode: Text.Fit
            horizontalAlignment: Text.AlignHCenter
            verticalAlignment: Text.AlignVCenter
        }
    }
}
up来自哪里?首先,它将查看使用它的对象-
矩形
矩形
没有
向上
-属性,因此它将继续并查找文件的根节点,即
旋转框
-它有一个
向上
-属性,该属性也有一个
按下
的值

当我们尝试使用它(错误的方式)时,情况看起来就不同了。让我们添加一个
应用程序窗口

import QtQuick 2.7
import QtQuick.Window 2.2
import QtQuick.Controls 2.0

ApplicationWindow {
    id: window

    width: 800
    height: 600
    visible: true

    SpinBox {
        id: control
        value: 50
        editable: true

        up.indicator: Rectangle {
            x: control.mirrored ? 0 : parent.width - width
            height: parent.height
            implicitWidth: 40
            implicitHeight: 40
            color: up.pressed ? "#e4e4e4" : "#f6f6f6"
            border.color: enabled ? "#21be2b" : "#bdbebf"

            Text {
                text: "+"
                font.pixelSize: control.font.pixelSize * 2
                color: "#21be2b"
                anchors.fill: parent
                fontSizeMode: Text.Fit
                horizontalAlignment: Text.AlignHCenter
                verticalAlignment: Text.AlignVCenter
            }
        }
    }
}
同一行-将尝试在
矩形中查找
up
,失败并继续查找文件根节点,该节点现在是
应用程序窗口
。在这里,它又失败了。由于
ApplicationWindow
未在可能存在另一个文件根节点的另一个文件中使用,搜索将结束并最终失败

出了什么问题?该示例的作者错过了应用始终使用完全限定标识符的良好实践的步骤:
id.property….
,例如,他定义了
矩形的
x
-值

更改行:

color: up.pressed ? [...]
致:

将解决这个问题,因为我们现在明确声明在哪里查找属性
up

重要课程

  • 名称不是通过从子节点到父节点来解析的,而是始终从子节点到文件根节点,依此类推,直到无法继续解析为止
  • 始终通过
    父对象
    (但请注意,您可能不知道父对象到底是什么。因此理想情况下,仅针对锚点和位置)或通过对象的
    id

请显示更多的代码。至少需要文件根节点的导入和结构(包括根节点)。我认为您删除了它周围的一个
(例如应用程序窗口)?@derM我没有删除任何内容。上面的代码只是复制粘贴:这正是您尝试执行的代码?这对我来说很好。请显示更多的代码。至少需要文件根节点的导入和结构(包括根节点)。我认为您删除了它周围的一个
(例如应用程序窗口)?@derM我没有删除任何内容。上面的代码只是复制粘贴:这正是您尝试执行的代码?这对我来说很好。我尝试了完全相同的方法,想添加一条评论,你很快;-)。。。谢谢你的详细解释。请投票。。回答得好,但我为开发者感到难过D在我的辩护中,我可能是从中复制的,因为控件是根。我会设法解决的。事实上,这是错误的。如果代码在它自己的文件中(例如
MySpinBox.qml
),那么它可以正常工作。只有当代码被粘贴到一个不是根项目的文件中时,问题才会出现。我尝试了完全相同的方法,并想添加一条注释,您非常快;-)。。。谢谢你的详细解释。请投票。。回答得好,但我为开发者感到难过D在我的辩护中,我可能是从中复制的,因为控件是根。我会设法解决的。事实上,这是错误的。如果代码在它自己的文件中(例如
MySpinBox.qml
),那么它可以正常工作。只有当代码粘贴到不是根项的文件中时,问题才会出现。