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 中,在布局中使用锚点被明确列为“禁止”。我的猜测是他们的意思是不要在布局元素或布局的父级之间使用锚点,而不是不要在单个布局单元格内锚定两个元素。
我在将 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 中,在布局中使用锚点被明确列为“禁止”。我的猜测是他们的意思是不要在布局元素或布局的父级之间使用锚点,而不是不要在单个布局单元格内锚定两个元素。