如何在QML中实现对象之间的单一连接?

时间:2018-12-06 15:07:22

标签: qt qml

在我的Qt应用程序中,我有很多窗口,有时它们需要一个“后退”按钮。此按钮位于ToolBar的{​​{1}}中的header组件上。

我要实现的是,此ApplicationWindow按钮将仅具有与其他对象的单个连接,即与名为Back方法的最后一个对象的连接。现在,每个connect都建立了一个新的连接,当信号发出时,它被多次调用。不幸的是,Qt没有connect方法,如果可以解决我的问题,我会先调用disconnectAll然后再disconnectAll来实现单一连接。

那么,您如何通过简单的方法在Qt中实现此功能?

这是一个最小的可复制示例,多次单击选项卡,然后按“返回”按钮,您将看到许多connect消息。我需要的是此消息,以与连接到console.log按钮的最后一个对象相对应。

Back

PageForm.ui的定义如下

import QtQuick 2.11
import QtQuick.Controls 2.4

ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: qsTr("Tabs")
    signal back_btn_clicked()

    SwipeView {
        id: swipeView
        anchors.fill: parent
        currentIndex: tabBar.currentIndex

        Page1Form {
            id: page1
            function page1_callback() {
                console.log("page 1 back button triggered")
            }
            function install_button() {
                enable_back_button(page1_callback)
            }
        }
        Page2Form {
            id: page2
            function page2_callback() {
                console.log("page 2 back button triggered")
            }
            function install_button() {

                enable_back_button(page2_callback)
            }
        }
        function install_back_button(idx) {
            if (idx===0) {
                page1.install_button()
            }
            if (idx===1) {
                page2.install_button()
            }
        }
    }
    Button {
        id: btn_back
        visible: false
        text: "Back Button"
        onClicked: back_btn_clicked()
    }

    footer: TabBar {
        id: tabBar
        currentIndex: swipeView.currentIndex

        TabButton {
            text: qsTr("Page 1")
            onClicked: swipeView.install_back_button(0)
        }
        TabButton {
            text: qsTr("Page 2")
            onClicked: swipeView.install_back_button(1)
        }
    }
    function enable_back_button(func_name) {
        btn_back.visible=true
        back_btn_clicked.connect(func_name)

    }
}

1 个答案:

答案 0 :(得分:1)

我认为最简单的技巧是将回调存储在一个属性中,然后在enable_back_button()中,在您的disconnect()函数中引用该属性,并使用传递的新回调相应地更新该属性作为函数参数。 (此参数的基本原理是disconnect()函数必须接受一个参数:断开连接的插槽。因此,我们需要以某种方式对其进行跟踪。) / p>

ApplicationWindow {
    visible: true
    // ... omitted for brevity

    property var prevCallback: null

    // ... ofb


    function enable_back_button(func_name) {
        btn_back.visible=true

        if (prevCallback)
            back_btn_clicked.disconnect(prevCallback)   // disconnect previous callback

        back_btn_clicked.connect(func_name)  // connect new callback

        prevCallback = func_name  // update property with new callback
    }
}

通过简单地将存储更改为数组,然后对其进行迭代,这也可以在多个连接上工作。