2017-06-11 227 views
0

我有一個矩陣QML輸出矩陣

QVector<QVector<double>> A; 

,我想輸出和編輯。 在QWidgets中,我將這個矩陣放入QAbstractTableModel子類中,並將其設置爲QTableView的模型。 在qml中,這似乎不適用於TableView。

正如我understood,爲固定大小的矩陣我可以明確地寫角色爲每列:

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

然後從QAbstractTableModel ::數據(...)對應的列中的每個角色的回報。

但是如果矩陣尺寸是在運行時計算的呢?在qml中使用這種矩陣的最佳方式是什麼?

+0

我想你應該通知[insertColumns](http://doc.qt.io/qt-5/qabstractitemmodel.html#insertColumns),[removeColumns](http://doc.qt.io/ qt-5/qabstractitemmodel.html#removeColumns)如果您的數據源已更改。 – folibis

+0

@folibis:我不認爲這會做到這一點,因爲afaik,QML不關心模型列。我認爲你應該揭露一個物業,例如'roleNames'然後您將其用作'Repeater'來創建帶有'role:modelData'的TableViewColumn's – derM

回答

0

注:可能是哈克,但工程

我還沒有一個QAbstractTableModel和QML的工作,到目前爲止,但我的理解,QML不關心列,所以ListModel應爲一個例子的足夠subsitution:

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

因爲這個方法試圖不與JS創建一個對象上調用destroy(),但是這是沒有問題的。 Instantiator將在之後立即刪除。

所以:雖然有錯誤信息,但只要您在每次改變時完全重置Instantiator的型號,就可以工作。