【问题标题】:Why QML Connections does not work here?为什么 QML Connections 在这里不起作用?
【发布时间】:2025-11-28 08:35:02
【问题描述】:

我正在学习 QML 并设计将在嵌入式 Linux 上运行的混合 QML/C++ 应用程序。

到目前为止,我有 4 页(Page0.qmlPage1.qmlPage2.qmlPage3.qml),我正在尝试使用 StackView 在它们之间导航。

所有 qml 文件都在 qml.qrc 资源文件中。

每个Page 的定义如下:

// Page0.qml
import QtQuick 2.9
import QtQuick.Controls 2.2

Page {
    id: root

    signal pageRequested(string pageUrl)

    background: Rectangle {
        anchors.fill: parent
        color: "orange"
    }

    Button {
        text: "Page 1"
        width: 100
        height: 100
        anchors.top: text.bottom
        anchors.horizontalCenter: text.horizontalCenter
        anchors.horizontalCenterOffset: 10
        onClicked: { 
            console.log("Button clicked")
            root.pageRequested("PAGESGRP1/Page1.qml")
        }
    }

    Label {
        id: text
        text: "You are on Page 0."
        font.pointSize: 25
        anchors.centerIn: parent
    }    
}

主页是:

// main.qml
import QtQuick 2.9
import QtQuick.Controls 2.2
import QtQuick.Window 2.2
// qml files are not in the directory of main.qml
// that's why i have these "import" statement
import "PAGESWELCOME" // Page0.qml
import "PAGESGRP1" // Page1.qml
import "PAGESGRP2" // Page2.qml
import "PAGESGRP3" //Page3.qml

Window {
    id: window
    visible: true

    Item {
        id: baseItem
        rotation: 90
        width: 1024
        height: 1280
        anchors.centerIn: parent

        Page0 {
            id: page0
        }

        Page1 {
            id: page1
        }

        Page2 {
            id: page2
        }

        Page3 {
            id: page3
        }

        StackView {
            id: stackView
            initialItem: "PAGESWELCOME/Page0.qml"
            anchors.fill: parent
        }

        Connections {
            target: page0
            onPageRequested: { // This signal handler is never called 
                console.log("Page 0 request page : " + pageUrl)
                stackView.push(Qt.resolvedUrl(pageUrl))
            }
        }

        Connections {
            target: page1
            onPageRequested: {
                console.log("Page 1 request page : " + pageUrl)
                stackView.push(Qt.resolvedUrl(pageUrl))
            }
        }

        Connections {
            target: page2
            onPageRequested: { 
                console.log("Page 2 request page : " + pageUrl)
                stackView.push(Qt.resolvedUrl(pageUrl))
            }
        }

        Connections {
            target: page3
            onPageRequested: {
                console.log("Page 3 request page : " + pageUrl)
                stackView.push(Qt.resolvedUrl(pageUrl))
            }
        }

    }
}

我的问题是StackView 总是停留在Page0。单击按钮后没有任何反应。

来自http://doc.qt.io/qt-5/qml-qtqml-connections.html#details

更一般地说,Connections 对象可以是某个对象的子对象 除了信号的发送者:

正确的做法是什么?

感谢您的帮助。

【问题讨论】:

    标签: qt qml


    【解决方案1】:

    您可以将 Connections 元素的 target 属性直接更改为 StackView:

    Connections {
        target: stackView.currentItem
    
        onPageRequested: { // This signal handler is never called
            console.log("Page 0 request page : " + pageUrl)
            stackView.push(Qt.resolvedUrl(pageUrl))
        }
    }
    

    因此,您可以从“PageX”容器组件中删除所有其他 Connections 元素。

    编辑:(来自eyllanesc 的提示)

    您可以从main.qml 中完全删除 PageX { } 元素。它们没有被使用,因为您没有在 StackView 上推送此元素,而是从传递的 Qml Url 中实例化一个新元素。

    因此,您的 Connections 容器无法正常工作。

    【讨论】:

    • 另外需要注意的是.qml中创建的PageX{...}并不是stackView中显示的对象
    • 我建议您指出,在您的问题中,我认为作者理解他的解决方案失败的原因是最重要的。
    最近更新 更多