我有一个包含我所谓的页面的窗口 - 一个与主窗口大小相同的矩形:
LoginWindow {
id: loginWindow
}
SelectionWindow {
id: selectionWindow
}
ServiceWindow {
id: serviceWindow
}
ConfirmWindow {
id: confirmWindow
}
IssueWindow {
id: issueWindow
}
此处的每个*窗口都是继承自Page。
的元素现在,我可以在设置其可见性的不同Page元素之间跳转。一次只能看到一个页面。最后一页是IssueWindow,从那里我想切换回LoginWindow并注销用户。
从C ++我发出信号issueFinished,在MainWindow我有这个代码:
onIssueFinished: {
// This line won't hide the Page
issueWindow.visible = false;
loginHandle.logout();
}
如评论中所述,Page元素不会隐藏,而其他元素会改变其可见性。我正在使用GammaRay来查看更改,一切正常,只是隐藏问题窗口没有。此外,当将issueWindow.visible打印到控制台时,它是错误的。
答案 0 :(得分:0)
使用opacity代替可见性,并在不透明度更改上绑定一个方法来处理启用和禁用状态,例如。
onIssueFinished: {
// This line won't hide the Page
issueWindow.opacity = 0.0;
loginHandle.logout();
}
IssueWindow {
id: issueWindow
onOpacityChanged: {
enabled = ( opacity === 1.0)
}
}
您需要在所有窗口中实现不透明度更改。 并为所有其他窗口设置不透明度。
或者您可以使用stack view或swipe view。
答案 1 :(得分:0)
发现问题实际上是切换可见性和触发信号以及响应它们的错误顺序。
答案 2 :(得分:0)
要确保只有一个页面可见,您可以使用索引。 您将可见性设置为:
visible: (selected == thisPageIdentifier)
有了这个,你确定只有具有相应pageIdentifyer的页面可见,你不必抛出多个信号来显示和隐藏。
当一个新页面变得可见时,只需将selected
属性设置为相应的标识符(int或string或者是什么),其他页面变为不可见。
如果您决定添加一个新页面,则应该增加可伸缩性,因为您没有新信号可以在所有其他页面中处理。您只需要确保标识符是唯一的。
您的示例代码已调整为:
Item {
property int selection: 0
LoginWindow {
id: loginWindow
visible: (selection === 0)
}
SelectionWindow {
id: selectionWindow
visible: (selection === 1)
}
ServiceWindow {
id: serviceWindow
visible: (selection === 2)
}
ConfirmWindow {
id: confirmWindow
visible: (selection === 3)
}
IssueWindow {
id: issueWindow
visible: (selection === 4)
}
}