为什么QML连接在这里不起作用?

时间:2018-08-14 14:09:27

标签: qt qml

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

到目前为止,我有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对象可以是某个对象的子对象   除了信号的发送者之外:

正确的方法是什么?

谢谢您的帮助。

1 个答案:

答案 0 :(得分:2)

您可以将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容器无法正常工作。