如何在SplitView子区域中使用StackView?是否支持多实例?
关于在SplitView局部区域使用StackView的问题
首先明确回答:完全可以在SplitView划分的局部区域使用StackView,而且界面的不同区域完全支持同时使用多个独立的StackView。
官方文档提到的"作为Window的子项使用"只是最典型的场景,并非限制——StackView本质上是一个可以嵌入任何Item容器的控件,只要父容器有明确的尺寸和布局约束,它就能正常工作。
你之前代码不符合预期的原因
看你提供的代码,主要问题出在布局约束的设置上:
- 主SplitView没有设置
anchors.fill: parent,导致整个布局没有填充窗口,尺寸异常; - SplitView的子项使用了固定的
width/height,而不是SplitView要求的Layout.fillWidth/Layout.fillHeight属性,打破了SplitView的自动布局逻辑; ItemMapRectangle中的StackView没有正确绑定到父容器的有效显示区域,导致它的尺寸不符合预期。
修正后的代码示例
1. 修正ItemMapRectangle组件
import QtQuick 2.0 import QtQuick.Layouts 1.3 import QtQuick.Controls 1.4 Item{ id: itemMapRectangle // 让组件填充SplitView分配的空间 Layout.fillWidth: true Layout.fillHeight: true Rectangle { id: mapRect color: "#4c4e50" border.color: "#404244" border.width: 3 anchors.fill: parent // 填充整个Item容器 } StackView{ id: stackView anchors.fill: parent // 绑定到Item的范围,即mapRect的显示区域 focus: true initialItem: Item { id: page // 添加示例内容方便测试 Text { text: "Initial Stack Page" anchors.centerIn: parent color: "white" font.pixelSize: 20 } } } }
2. 修正主SplitView布局
import QtQuick 2.9 import QtQuick.Window 2.2 import QtQuick.Layouts 1.3 import QtQuick.Controls 1.4 import "../geoforms" SplitView { id: splitView0 orientation: Qt.Horizontal anchors.fill: parent // 让主SplitView填充整个窗口 SplitView { id: splitView1 Layout.fillWidth: true Layout.minimumWidth: window.width/10*2 Layout.maximumWidth: window.width/10*8 orientation: Qt.Vertical // 使用修正后的组件 ItemMapRectangle{ id:newMapRectangle Layout.fillWidth: true Layout.fillHeight: true } FPArea{ id: flightPlanArea Layout.fillWidth: true Layout.fillHeight: true } } SplitView { id: splitView2 Layout.fillWidth: true // 自动分配剩余空间 orientation: Qt.Vertical FPMap{ id: newFlightPlanMap Layout.fillWidth: true Layout.fillHeight: true } AltitudePM{ id: newAltitudePlanMap Layout.fillWidth: true Layout.fillHeight: true } IME{ id: newButtonArea color: "grey" mainGridProp.rows : 3 mainGridProp.columns: 2 mainGridProp.spacing: 20 Layout.fillWidth: true Layout.fillHeight: true } } }
关于多StackView的说明
你完全可以在界面的不同区域(比如splitView2里的某个区域)再添加另一个StackView,它们的页面栈是完全独立的,各自管理自己的页面切换逻辑,互不干扰。只要给每个StackView设置独立的id,就能分别调用push()、pop()等方法来控制各自的页面栈。
内容的提问来源于stack exchange,提问作者kontiki
相关产品推荐
相关产品推荐

