QML类型:TableView
⼀、描述
TableView 显⽰从内置 QML 类型(如 ListModel 和 XmlListModel)创建的模型中的数据,这些模型仅填充 TableView 中的第⼀列。要创建具有多列的模型,请使⽤ 或继承 QAbstractItemModel 的 C++ 模型。
TableView 继承了 。这意味着虽然模型可以有任意数量的⾏和列,但在视⼝内通常只能看到表格的⼀部分。 ⼀旦轻弹,新的⾏和列就会进⼊视⼝,⽽旧的会退出并从视⼝中移除。 移出的⾏和列被重新⽤于构建移⼊视⼝的⾏和列。因此,TableView ⽀持任何⼤⼩的模型⽽不影响性能。
⼆、使⽤⽰例
2.1、C++模型
#include <qqml.h>
#include <QAbstractTableModel>
class testModel : public QAbstractTableModel
{
Q_OBJECT
QML_ELEMENT
QML_ADDED_IN_MINOR_VERSION(1)
public:forever love什么意思
int rowCount(const QModelIndex & = QModelIndex()) const override
{
return 10;
}
int columnCount(const QModelIndex & = QModelIndex()) const override
{
return 5;
}
QVariant data(const QModelIndex &index, int role) const override
{
switch (role)
{
ca Qt::DisplayRole:
return QString("%1, %2").lumn()).w());
default:
break;
}
return QVariant();
}
QHash<int, QByteArray> roleNames() const override
{
return { {Qt::DisplayRole, "display"} };
}
};
qmlRegisterType<testModel>("pany.qmlcomponents", 1, 0, "TestModel");
import QtQuick.Controls 2.5
pany.qmlcomponents 1.0
Window
greatwall
{
width: 800
tongue tied
height: 400
visible: true
TableView
{
anchors.fill: parent
columnSpacing: 1
rowSpacing: 1
clip: true
model: TestModel
bataclan
{
坚壁清野}
delegate: Rectangle
{
implicitWidth: 100
implicitHeight: 50
Text
{
text: display
}
}
}
}
2.2、QML模型
Window
{
width: 400;height: 400
visible: true
TableView
{
anchors.fill: parent
columnSpacing: 1
rowSpacing: 1
clip: true
model: TableModel
{
TableModelColumn { display: "name" } TableModelColumn { display: "color" }
rows:
[
{
"name": "cat",
"color": "black"
},
{
"name": "dog",
"color": "brown"
},
{
"name": "bird",
"color": "white"
}
]
}
delegate: Rectangle
{
implicitWidth: 100
implicitHeight: 50
border.width: 1
Text
{
text: display
}
}
}
}
网课平台哪个好
三、重复使⽤项⽬
默认情况下,TableView 回收委托项,⽽不是在新⾏和新列被轻弹到视图时从委托实例化。这种⽅法提供了巨⼤的性能提升,具体取决于委托的复杂性。
当⼀个项⽬被弹出时,它会移动到重⽤池(未使⽤项⽬的内部缓存区)。这时会发出 pooled()信号以通知该项⽬。同样,当项⽬从池中移回时,会发出 reud()信号。
当项⽬被重⽤时,来⾃模型的任何项⽬属性都会更新。包括索引、⾏和列,还包括任何模型⾓⾊。
注意:应避免在委托中存储项⽬的任何状态。如果这样做,应在收到 reud() 信号时重置它。
如果项⽬有计时器或动画,应考虑在收到 pooled() 信号时暂停它们。这样就可以避免将 CPU 资源⽤于不可见的项⽬。同样,如果项⽬具有⽆法重⽤的资源,则可以将其释放。
如果不想重⽤项⽬或者如果委托不⽀持它,可以将重⽤项⽬ reuItems 属性设置为 fal。
注意:当⼀个项⽬在池中时,它可能仍然处于活动状态并响应连接的信号和绑定。
以下⽰例显⽰了⼀个为旋转矩形设置动画的委托。进⼊重⽤池时,动画暂时暂停:
延续的意思
Component
{
英国大使馆签证中心
id: tableViewDelegate
Rectangle
{
implicitWidth: 100
implicitHeight: 50
Rectangle
{
id: rect
hoist
width: 40
height: 5
color: "green"
RotationAnimation
{
id: rotationAnimation
target: rect
duration: (Math.random() * 2000) + 200
from: 0
to: 359
running: true
loops: Animation.Infinite
}
}
}
}
四、⾏⾼和列宽
当⼀个新列被轻弹到视图中时,TableView 将通过调⽤ columnWidthProvider() 函数来确定它的宽度。TableView 不存储⾏⾼或列宽,因为它旨在⽀持包含任意数量⾏和列的⼤型模型。
TableView 使⽤项中最⼤的隐式宽度(委托的 implicitWidth)作为列宽,除⾮明确设置了 columnWidthProvider()。找到列宽后,同⼀列中的所有其他项⽬都将调整为该宽度,即使稍后轻弹的
新项⽬具有更⼤的隐式宽度。在项⽬上设置显式宽度将被忽略并覆盖。
注意:列的计算宽度在从视⼝中弹出时会被丢弃,如果该列被弹回,则重新计算。计算始终基于该列弹⼊时可见的项⽬。这意味着该列的宽度每次都可能不同,具体取决于该列进⼊时所在的⾏。因此,应该对列中的所有项⽬具有相同的隐式宽度,或设置
columnWidthProvider() 。相同的逻辑适⽤于⾏⾼计算。
如果更改 rowHeightProvider() 或 columnWidthProvider() 为视⼝内的⾏和列返回的值,则必须调⽤ forceLayout()。这会通知TableView 它需要再次使⽤提供程序函数来重新计算和更新布局。
plea是什么意思如果要隐藏特定列,可以从该列的 columnWidthProvider() 返回 0。同样,可以从 rowHeightProvider() 返回 0 以隐藏⾏。如果返回负数,TableView 将回退以根据委托项计算⼤⼩。
columnWidthProvider:function(column)
{
return 0
}
注意:⾏或列的⼤⼩应为整数,以避免项⽬的亚像素对齐。
五、叠加层和底层
从委托实例化的所有新项⽬都作为 z 值为 1 的 contentItem 的⽗项。可以在 Tableview 中⾃⾏添加项⽬作为 Flickable 的⼦项⽬。通过控制它们的 z 值,可以使它们位于表格项⽬的顶部或底部。
在表格顶部添加⼀些⽂本,当轻弹时,这些⽂本会与表格⼀起移动: