QML 无法隐藏矩形

QML can't hide Rectangle

本文关键字:隐藏 QML      更新时间:2023-10-16

我有一个窗口包含我称之为页面的矩形,大小与主窗口相同:

LoginWindow {
    id: loginWindow
}
SelectionWindow {
    id: selectionWindow
}
ServiceWindow {
    id: serviceWindow
}
ConfirmWindow {
    id: confirmWindow
}
IssueWindow {
    id: issueWindow
}

这里的每个*Window都是继承自Page的元素。

现在我可以在不同的页面元素之间跳转设置它们的可见性。一次只能显示一个页面。最后一页是IssueWindow,从那里我想切换回LoginWindow并注销用户。

从c++中我发出一个信号issueFinished,在MainWindow中我有这样的代码:

    onIssueFinished: {
        // This line won't hide the Page
        issueWindow.visible = false;
        loginHandle.logout();
    }

正如评论中提到的,Page元素不会隐藏,而其他元素会改变它们的可见性。我正在使用GammaRay来查看变化和一切工作,只是隐藏问题窗口没有。在打印问题窗口时也是如此。

使用不透明度而不是可见性,并绑定一个不透明度更改方法,该方法处理启用和禁用状态,如

onIssueFinished: {
        // This line won't hide the Page
        issueWindow.opacity = 0.0;
        loginHandle.logout();
    }
IssueWindow {
    id: issueWindow
    onOpacityChanged: {
        enabled = ( opacity === 1.0)
    }
}

你需要在所有窗口中实现不透明度的改变。并设置所有其他窗口的不透明度。

发现问题实际上是切换可见性和发射信号并响应它们的顺序不正确。

为了确保只有一个Page可见,您可以使用索引。您将可见性设置为:

visible: (selected == thisPageIdentifier)

这样可以确保只有具有相应pageidentifier的页面是可见的,并且您不必使用多个信号来显示和隐藏。
当一个新的页面变为可见时,只需将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)
    }
}