QML 包装的 TableView 元素的行为不同于 non-wrapped 一个

QML wrapped TableView element behaves different from non-wrapped one

我在将 QML 类型 TableView 包装在另一个项目中时无法正常运行。问题在于,创建可重用类型基本上会强制人们使用 Item 包装器将 *HeaderView 类型放在同一个 .qml 文件中。下面是比较简单的代码,一些数据的test-model可以取自官方的TableView documentation.

import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import TableModel

Window {  
    width: 600
    height: 480
    visible: true

    // This item wrapper changes TableView behavior
    Item {
        width: 600
        height: 250
    // --------------------------------------------

        TableView {
            id: tableView
            anchors.fill: parent
            topMargin: horizontalHeader.implicitHeight
            leftMargin: verticalHeader.implicitWidth
            columnSpacing: 1
            rowSpacing: 1
            clip: true

            model: TableModel {}

            delegate: Rectangle {
                implicitWidth: 150
                implicitHeight: 25
                Text {
                    text: display
                }
            }
        }

        HorizontalHeaderView {
            id: horizontalHeader
            syncView: tableView
        }

        VerticalHeaderView {
            id: verticalHeader
            syncView: tableView
        }
    // --------------------------------------------
    }
    // --------------------------------------------
}

没有 Item 包装器(请参阅代码中的注释)我的 TableView 看起来像预期的那样:

但是一旦包裹在一个项目中,水平和垂直 headers 就会被放置在实际的 table 之上。

出于某种奇怪的原因,此位移仅与 table 的第一个渲染相关。一旦我将 table 中的数据稍微拖动了一下(我想激活“Flickable”继承类型?),数据突然卡入到位并正确显示在 headers.[=15= 之外]

显然在尝试附加 *HeaderView 时使用 anchors.fill: parent 不是一个好主意。一旦我摆脱了那条线并简单地将所有视图彼此锚定(水平到顶部,垂直到左侧)它就起作用了。

Item {  
    implicitWidth: 600
    implicitHeight: 250

    TableView {
        id: tableView
        implicitWidth: parent.implicitWidth
        implicitHeight: parent.implicitHeight
        anchors.top: horizontalHeader.bottom
        anchors.left: verticalHeader.right
        columnSpacing: 1
        rowSpacing: 1
        clip: true

        model: TableModel {}

        delegate: Rectangle {
            implicitWidth: 150
            implicitHeight: 25
            Text {
                text: display
            }
        }
    }

    HorizontalHeaderView {
        id: horizontalHeader
        anchors.left: verticalHeader.right
        clip: true
        syncView: tableView
    }

    VerticalHeaderView {
        id: verticalHeader
        anchors.top: horizontalHeader.bottom        
        clip: true        
        syncView: tableView
    }    
}

请注意,在官方 Qt docs 中,在布局中使用锚点被明确列为“禁止”。我的猜测是他们的意思是不要在布局元素或布局的父级之间使用锚点,而不是不要在单个布局单元格内锚定两个元素。