QML输出矩阵

时间:2017-06-11 00:57:23

标签: c++ qt qml qtquick2 model-view

我有一个矩阵

QVector<QVector<double>> A;

我想输出和编辑。 在QWidgets中,我将此矩阵放入QAbstractTableModel子类中,并将其设置为QTableView的模型。 在qml中,这似乎不适用于TableView。

作为understood,对于固定大小的矩阵,我可以为每列显式编写角色:

TableViewColumn {
        role: "first" // "second", "third" etc.
}

然后为每个角色返回QAbstractTableModel :: data(...)中的相应列。

但是如果矩阵尺寸是在运行时计算的呢?在qml中使用这种矩阵的最佳方法是什么?

1 个答案:

答案 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(因为TableViewColumnItem似乎没有tv.removeColumn

这里出现的一个问题是,我找不到访问列索引的方法,我需要使用正确的索引调用tv.removeColumn(0)。但在这种情况下,我总是替换整个模型,这是没有问题,只要我删除所有列,一个接一个地删除第一个Error: Invalid attempt to destroy() an indestructible object。我仍然会收到错误

  

destroy()

因为此方法试图在不是用JS创建的对象上调用Instantiator,但这没有问题。 Instantiator会立即将其删除。

所以:虽然有错误信息,但只要您在每次更改时完全重置{{1}}的模型,这都会有效。