在QML

时间:2017-11-17 17:29:05

标签: qt user-interface qml signals-slots

我正在尝试根据活动标签的状态/功能启用/禁用工具栏按钮(任何UI状态)。

所以说我们有一个带有Save(文件)按钮的工具栏,第一个选项卡报告可以保存文件(或其他),因此启用了Save按钮,但切换到第二个选项卡应禁用Save按钮,因为它报告无法保存文件。

此报告使用QML中Tab对象本身的其他属性/函数完成。

在TabView上实现onCurrentIndexChanged确实提供了设置按钮初始状态的机会。但问题是,用户可以 - 例如 - 在第二个选项卡中选择一些东西,使其能够保存文件 - 这应该(重新)启用工具栏中的“保存”按钮。

这是我们可以作为共同基础使用的一些框架代码。 Main.qml

ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: "Update UI Test"

    header: ToolBar {
        ToolButton {
            id: toolButton
            text: "?"
        }
    }

    TabView {
        id: tabView
        anchors.fill: parent

        Tab {
            title: "Tab 1"
            PageTest {
            }
        }

        Tab {
            title: "Tab 2"
            PageTest {
            }
        }
    }
}

PageTest.qml

Page {
    property alias checked: checkBox.checked

    CheckBox {
        id: checkBox
        x: 200
        y: 100
        text: "Enable"
    }
}

我不知道如何连接点以使其正常工作。

1 个答案:

答案 0 :(得分:0)

回答我自己的问题,希望有一天这对其他人有用。

这是我如何工作的代码。当然,我的真实场景更复杂,但孤立这个问题确实带来了新的知识。

在每个页面上,您必须声明相同的接口(属性/方法/信号),以便主调用页面将所有页面视为相同的类型。

我选择在页面上定义的信号中传递对象本身。这允许任何连接的槽访问属性和方法的接口(在本例中为'checked'-alias-属性)。

然后我在知道如何更新UI的中心位置创建了一个函数 -  主窗口上的updateUI功能 - 并且当Tab完成加载时,连接到每个信号的每个页面都有一个。我不知道连接这些的任何其他位置。

最后,onCurrentIndexChanged处理程序确保在切换选项卡时UI更新为新选择页面的状态。

ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: "Update UI Test"

    function updateUI(page) {
        toolButton.enabled = page.checked
    }

    header: ToolBar {
        ToolButton {
            id: toolButton
            text: "?"
        }
    }

    TabView {
        id: tabView
        anchors.fill: parent

        Tab {
            title: "Tab 1"
            PageTest {
                Component.onCompleted: {
                    changed.connect(updateUI)
                }
            }
        }

        Tab {
            title: "Tab 2"
            PageTest {
                Component.onCompleted: {
                    changed.connect(updateUI)
                }
            }
        }

        onCurrentIndexChanged: {
            updateUI(tabView.getTab(tabView.currentIndex).children[0])
        }
    }
}


Page {
    id: page
    property alias checked: checkBox.checked

    signal changed(variant page)

    CheckBox {
        id: checkBox
        x: 200
        y: 100
        text: "Enable"

        onCheckStateChanged: {
            changed(page)
        }
    }
}