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

Posted

技术标签:

【中文标题】在 ui.qml 文件中的组件上添加业务逻辑【英文标题】:Adding business logic on components in the ui.qml files 【发布时间】:2017-07-17 11:30:31 【问题描述】:

我有一个 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】:

问题是,您只能通过对象的id 访问同一文件中的对象或在对象树中向上爬。

如果您仔细阅读this,您会发现,他们不会通过id 访问按钮,而是将按钮导出为属性

这是通过这一行完成的:

property alias button: button

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


来自文档:

属性别名将按钮导出到使用表单的 QML 代码。 您可以使用导航器中的(导出)按钮将项目导出为属性(来源:doc.qt.io)


在您的代码中如下所示:

// 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"

    // export the MouseArea as a property here
    property alias exitButtonMouseArea: exitButtonMouseArea

    MouseArea 
        id: exitButtonMouseArea
        anchors.fill: parent
    

//main.qml

StatusBarExitForm 
    // access the MouseArea via the property here
    exitButtonMouseArea.onClicked: Qt.quit()

【讨论】:

感谢您的回答。请看我的编辑。我不确定我错过了什么。问题是我正在尝试的事件是在 Image 对象的 MouseArea 上。 我认为在你的编辑中,你把它搞砸了。您可以/应该在表单中添加MouseArea。您将其作为属性导出到表单中。当您实例化/使用表单时,您可以通过之前创建的属性访问MouseArea 来处理信号。 好的,我知道了。问题是导出必须在顶层完成,所以不是在Image 组件内部,而是在它外部。感谢您的帮助! 是的,您可以/应该始终只访问组件根节点的属性。

以上是关于在 ui.qml 文件中的组件上添加业务逻辑的主要内容,如果未能解决你的问题,请参考以下文章

自定义组件之crm的业务逻辑

如果我从控制器中取出逻辑,是不是需要业务逻辑层?

使用vue实现日历组件的封装

Android MVC MVC简介

Flutter Hooks — 快速了解

restful架构风格设计准则资源识别和资源设计