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)
    }
}