在ui.qml文件中的组件上添加业务逻辑

时间:2017-07-17 11:30:32

标签: qt qml qt-quick qtquick-designer

我有一个QML快速表单,我有一个图像和一个相关的鼠标区域,如下所示:

// StatusBarForm.ui.qml
Image {
    id: exitButton
    width: 24
    height: 24
    anchors.verticalCenter: parent.verticalCenter
    anchors.left: parent.left
    anchors.leftMargin: 5
    source: "images/exit.png"

    MouseArea {
        id: exitButtonMouseArea
        anchors.fill: parent
    }
}

现在,根据文档我应该分离业务逻辑,设计师创建了一个StatusBar.qml表单,我补充说:

exitButtonMouseArea.onClicked: {
    Qt.quit()
}

现在问题是我在Mac上使用Qt 5.9对其进行了测试并且它有效(尽管Qt创建者强调了onClicked处理程序抱怨exitButtonMouseArea identifier was not valid。我也尝试了exitButton.exitButtonMouseArea.onClicked:

现在我在Linux上使用Qt 5.8尝试了它并且应用程序没有初始化。如果我删除了事件处理程序,那就好了,当然我无法与图像交互。

所以,我的问题是如何在我的案例中提供UI文件之外的业务逻辑。

修改 在@derM回答之后,我做了以下事情:

// StatusBarForm.ui.qml
Image {
    id: exitButton
    width: 24
    height: 24
    anchors.verticalCenter: parent.verticalCenter
    anchors.left: parent.left
    anchors.leftMargin: 5
    source: "images/exit.png"    
}

// StatusBar.qml
StatusBarForm {
    property alias exitButton: exitButton

    Image {
        id: exitButton
        MouseArea {
            id: exitButtonMouseArea
            anchors.fill: parent
            onClicked: {
                Qt.quit()
            }
        }
    }
}

我的组件初始化时,我从未收到onClicked事件。

1 个答案:

答案 0 :(得分:3)

问题是,您只能在同一个文件中按SELECT t1.Connected, t1.Region, t1.Homespassed FROM connected as t1 UNION ALL SELECT t2.Connected, t2.Region, t2.Homespassed FROM connected as t2 访问对象,或者在对象树中爬行。

如果您仔细阅读this,则会发现他们没有通过Connected | Region | Homespassed | Year 访问该按钮,但他们将该按钮导出为属性

这是由这一行完成的:

id

导出后,您可以使用属性名称从外部访问它。

来自文档:

  

属性别名将按钮导出到使用该表单的QML代码。 您可以使用导航器中的(导出)按钮将项目导出为属性:   http://doc.qt.io/qtcreator/creator-quick-ui-forms.html#using-qt-quick-ui-forms

在您的代码中,这将是这样的:

// StatusBarForm.ui.qml

id

// main.qml

property alias button: button