C++ 输出矩阵
我有一个矩阵C++ 输出矩阵,c++,qt,qml,qtquick2,model-view,C++,Qt,Qml,Qtquick2,Model View,我有一个矩阵 QVector<QVector<double>> A; 然后,对于每个角色,从QAbstractTableModel::data(…)返回相应的列 但如果矩阵维数是在运行时计算的呢?在qml中使用此类矩阵的最佳方法是什么 注意:可能有点骇人,但很有效 到目前为止,我还没有使用过QAbstractTableModel和QML,但据我所知,QML不关心列,因此ListModel应该是示例的足够替代品: import QtQuick 2.7 import QtQ
QVector<QVector<double>> A;
然后,对于每个角色,从QAbstractTableModel::data(…)返回相应的列
但如果矩阵维数是在运行时计算的呢?在qml中使用此类矩阵的最佳方法是什么
注意:可能有点骇人,但很有效
到目前为止,我还没有使用过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
s数量,然后使用实例化器将其添加到TableView
(因为TableViewColumn
似乎不是项)
这里出现的一个问题是,我没有找到访问列索引的方法,我需要使用适当的索引调用tv.removeColumn
。但在这种情况下,我总是替换整个模型,只要我通过始终使用tv.removeColumn(0)
删除第一列,一列接一列地删除所有列,这就没有问题。我仍然会得到一个错误
错误:销毁()不可摧毁对象的尝试无效
由于此方法试图对不是用JS创建的对象调用destroy()
,但这没有问题。实例化器将在之后立即删除它
因此:虽然有一条错误消息,但只要每次发生更改时完全重置实例化器的模型,这将起作用。如果数据源已更改,我想您应该通知表。@folibis:我认为这不会起作用,因为,好吧,QML不关心模型列。我认为您应该公开一个属性,例如roleNames
,然后将其用作中继器
,用角色:modelData
创建TableViewColumn
s
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)
}
}