2017-06-11 4 views
0

私は私が出力され、編集したい行列QML出力行列

QVector<QVector<double>> A; 

を持っています。 QWidgetsでは、この行列をQAbstractTableModelサブクラスに入れ、これをQTableViewのモデルとして設定します。 qmlでは、これはTableViewでは動作しません。

I 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:それは、アフリカ、QMLはモデルの列を気にしないので、トリックを行うとは思わない。私はあなたが不動産を公開すべきだと思います。 'roleNames'を呼び出し、' Repeater'として 'role:modelData'を使って' TableViewColumn'を作成します。 – 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) 
    } 
} 

第2のモデルを追加することにより、私はその後、追加TableViewColumn Sの十分それに応じて構成された量を作成します(TableViewColumnItemと思われるので)Instantiatorを使用してTableViewに転送します。

ここで問題になるのは、私が列インデックスにアクセスする方法が見つからないということです。tv.removeColumnを適切なインデックスで呼び出す必要があります。しかし、この場合、私は常にモデル全体を置き換えますが、すべての列を削除していくうちに、最初は常にtv.removeColumn(0)を削除しても問題ありません。この方法は、JSを使用して作成されていないオブジェクトにdestroy()を起動しようとしますが、これは問題ありませんように私はまだ

Error: Invalid attempt to destroy() an indestructible object

エラーが発生します。 Instantiatorは直後に削除されます。

So:エラーメッセージが表示されますが、変更があるたびにInstantiatorのモデルを完全にリセットする限り、これは機能します。