我正在学习QML,并设计了一个混合QML / C ++应用程序,它将在嵌入式Linux上运行。
到目前为止,我有4页(Page0.qml
,Page1.qml
,Page2.qml
,Page3.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对象可以是某个对象的子对象 除了信号的发送者之外:
正确的方法是什么?
谢谢您的帮助。
答案 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
容器无法正常工作。