我有一个矩阵
QVector<QVector<double>> A;
我想输出和编辑。 在QWidgets中,我将此矩阵放入QAbstractTableModel子类中,并将其设置为QTableView的模型。 在qml中,这似乎不适用于TableView。
作为understood,对于固定大小的矩阵,我可以为每列显式编写角色:
TableViewColumn {
role: "first" // "second", "third" etc.
}
然后为每个角色返回QAbstractTableModel :: data(...)中的相应列。
但是如果矩阵尺寸是在运行时计算的呢?在qml中使用这种矩阵的最佳方法是什么?
答案 0 :(得分:0)
注意:可能是hacky但是有效
到目前为止,我还没有使用过QAbstractTableModel
和QML,但根据我的理解,QML并不关心列,所以ListModel
应该是一个足够的替代例子:
import QtQuick 2.7
import QtQml 2.2
import QtQuick.Controls 1.4
ApplicationWindow {
id: myWindow
visible: true
width: 600
height: 600
color: 'white'
ListModel {
id: lv
property var roleNames: ['role1', 'role2']
ListElement { role1: 'a'; role2: 'b' }
}
ListModel {
id: tm
property var roleNames: [ 'myID', 'age', 'name']
ListElement { myID: 1; name: 'Egon'; age: 15 }
ListElement { myID: 2; name: 'Herbert'; age: 21 }
ListElement { myID: 3; name: 'Jan'; age: 11 }
ListElement { myID: 4; name: 'Dieter'; age: 23 }
ListElement { myID: 5; name: 'Ulrich'; age: 6 }
ListElement { myID: 6; name: 'Hans'; age: 45 }
ListElement { myID: 7; name: 'Frieder'; age: 31 }
ListElement { myID: 8; name: 'Gerd'; age: 28 }
}
TableView {
id: tv
model: lv
anchors.fill: parent
Instantiator {
model: tv.model ? tv.model.roleNames : 0
delegate: TableViewColumn {
title: modelData
role: modelData
Component.onCompleted: tv.addColumn(this)
Component.onDestruction: tv.removeColumn(0)
}
}
}
MouseArea {
anchors.fill: parent
onClicked: tv.model = (tv.model === lv ? tm : lv)
}
}
通过添加第二个模型,我创建了足够且相应配置的TableViewColumn
个数量,然后我使用TableView
添加到Instantiator
(因为TableViewColumn
是Item
似乎没有tv.removeColumn
。
这里出现的一个问题是,我找不到访问列索引的方法,我需要使用正确的索引调用tv.removeColumn(0)
。但在这种情况下,我总是替换整个模型,这是没有问题,只要我删除所有列,一个接一个地删除第一个Error: Invalid attempt to destroy() an indestructible object
。我仍然会收到错误
destroy()
因为此方法试图在不是用JS创建的对象上调用Instantiator
,但这没有问题。 Instantiator
会立即将其删除。
所以:虽然有错误信息,但只要您在每次更改时完全重置{{1}}的模型,这都会有效。