ColumnLayout 中的 QML TabView

Posted

技术标签:

【中文标题】ColumnLayout 中的 QML TabView【英文标题】:QML TabView in ColumnLayout 【发布时间】:2014-11-21 21:44:31 【问题描述】:

我正在尝试修改图库示例。我想在TabView 下添加Button。所以,我把TabViewButton放入ColumnLayout,代码如下:

import QtQuick 2.3
import QtQuick.Controls 1.2
import QtQuick.Layouts 1.1
import QtQuick.Controls.Styles 1.1
import QtQuick.Window 2.0

Window 
    visible: true
    title: "settings"
    width: 600
    height: 400
ColumnLayout
    anchors.fill: parent
    TabView 
        anchors.right: parent.right
        anchors.left: parent.left
        Tab 
            title: "Controls"
            Controls  
        
        Tab 
            title: "Itemviews"
            Controls  
        
        Tab 
            title: "Styles"
            Controls   
        
        Tab 
            title: "Layouts"
            Controls   
        
    

    RowLayout
        anchors.right: parent.right
        anchors.left: parent.left
        Button
            text: "ok"
        
    



但是,当我调整窗口大小时,okButton 位于选项卡控件下。我应该如何修复代码?

【问题讨论】:

您将 Button 放在 TabView 下,如我所见,那么您的问题是什么?我不能仅仅因为 udefined Controls 而测试你的例子,但可能你应该使用 Layout.fillHeightLayout.fillWidth 来代替 TabView?但不要忘记设置 RowLayout 的高度 @folibis Controls.qmlQt Quick Controls - Gallery 示例中。只需打开 Qt creator -> Welcome 并输入“Gallery”。当我调整窗口大小时okButton 不在TabView 之下,而是在TabView 之上 【参考方案1】:

定义Layout 后,添加的每个元素都可以访问与布局本身相关的特定属性。这些属性对于将元素定位在布局覆盖的空间内很有用。面对here 的描述。

因此,您应该像这样修改ColumnLayout

ColumnLayout 
    anchors.fill: parent                   
    TabView 
        id:frame
        enabled: enabledCheck.checked
        tabPosition: controlPage.item ? controlPage.item.tabPosition : Qt.TopEdge
        Layout.fillHeight: true            // fill the available space vertically 
        Layout.fillWidth: true             // fill the available space horizontally
        Layout.row: 0                      // item in the first row of the column
        anchors.margins: Qt.platform.os === "osx" ? 12 : 2
        Tab 
            id: controlPage
            title: "Controls"
            Controls  
        
        Tab 
            title: "Itemviews"
            ModelView  
        
        Tab 
            title: "Styles"
            Styles  anchors.fill: parent 
        
        Tab 
            title: "Layouts"
            Layouts  anchors.fill:parent 
        
    

    Button 
        text: "ok"
        Layout.row: 1                       // item in the second row of the column
        Layout.alignment: Qt.AlignCenter    // simple center the button in its spatial slot
    

按钮不需要RowLayout。它应该放在您定义的ColumnLayout 的第二行,因为它是一个简单的组件。如果 多个 元素位于同一行,子布局可能很有用,例如两个或更多按钮。

另请注意,锚定仅用于ColumnLayout 以“拉伸”并适合窗口。所有其他操作都通过布局属性执行。有关一般规则,请查看this 其他文章。

【讨论】:

当我调整窗口大小时,okButton 位于选项卡控件的上方 如果您照原样采用图库示例,并按照我所做的那样更改代码,则不应该这样做。如果您删除了可能的最小宽度:这取决于选项卡组件的设置。那是一个完全不同的问题。事实上ControlsLayout.minimumWidth: implicitWidth...你不能只调整Window 的大小而不考虑组件的布局。 我增加了 minimumWidth 和 Height。现在它工作正常 就是这样。 :) 我会推荐阅读我提供的链接。他们会澄清您可能有的任何疑问。

以上是关于ColumnLayout 中的 QML TabView的主要内容,如果未能解决你的问题,请参考以下文章

Qt5-QML:ColumnLayout 在嵌套循环中覆盖另一个 ColumnLayout

如何在 QML 的 ColumnLayout 中使用 topMargin

QML ColumnLayout 不尊重 minimumHeight

QML在Component中使用createObject填充ColumnLayout

如何在 QML 的 ColumnLayout 中使用自己的对象?

QML/QtQuick:使图像在 ColumnLayout 中仅占用可用高度