2014-12-01 29 views
7

QAbstractTableModel görüntülemek için QML TableView kullanmaya çalışıyorum. Denklemin eksik kısmı,'u geçersiz kılmamalarına rağmen TableView numaralı kolonda değişken bir sütun sayısına sahip olmamak gibi görünmektedir; bu, Qt'ye sütunlarımın numarasını ve adını söylemelidir. Sadece QML kullanarak bu dışarı test çalıştı: çalıştırdığınızda QML TableView dinamik sütun sayısı

import QtQuick 2.0 
import QtQuick.Controls 1.1 

Rectangle { 
    anchors.fill: parent 
    property real showImage: 1.0 
    width: 500 
    TableView { 
     id: myTable 
     model: myModel 
     //  TableViewColumn { 
     //   role: "title"; title: "Name"; width: 200 
     //  } 
    } 

    ListModel { 
     id: myModel 
     ListElement { 
      title: "item one" 
     } 
     ListElement { 
      title: "item two" 
     } 
    } 
} 

bu onlardan tanımlanan rollerle ListElement s içeren TableView 'ın modunda rağmen hiçbir şey göstermez.

Ancak, yukarıdaki kod uncommented ise ve bir TableViewColumn tanımlanmışsa, sütun bu rolün verilerini beklendiği gibi görüntüleyecek, ancak tablo başka roller göstermeyecektir. Açıkçası, bu yalnızca statik olarak tanımlanmış bir sayıda sütun için çalışacak ve benim çalışma zamanına kadar sütun sayısı bilinmeyen durumumda değil.

Verilen örnek benim modelimin C++'da tanımlanması dışında benim temel yaşam örneğimle aynıdır.

Bu zaten here sorulmuş olabilir, ancak herhangi bir yanıt almadı gibi görünüyor.

DÜZENLEME: C itibaren

function addColumnToTable(roleName) { 
    var columnString = 'import QtQuick 2.3; import QtQuick.Controls 1.2; TableViewColumn {role: "' 
      + roleName + '"; title: "' + roleName + '"; width: 40}'; 
    var column = Qt.createQmlObject(
       columnString 
       , myTable 
       , "dynamicSnippet1") 
    myTable.addColumn(column); 
} 

++:

QVariant roleName = "name"; 
QObject *root = view->rootObject(); 
QMetaObject::invokeMethod(root, "addColumnToTable", Q_ARG(QVariant, roleName)); 

Bu en azından bana dinamik modeli içinden olmasa da C++ sütun eklemek için izin Bir javascript işlevi çağırarak çalıştı/mimari görünümü. Yoann’ın çözümü bundan çok uzak ve uzak. Dinamik İhtiyacınız kadar TableViewColumn, gibi TableView ait resources özelliğini kullanarak oluşturabilir

cevap

11

.

Özel model sınıfınızda, görüntülemek istediğiniz roleNames verecek bir yöntem eklemeniz gerekecektir.

QML:

Component 
{ 
    id: columnComponent 
    TableViewColumn{width: 100 } 
} 

TableView { 
    id: view 
    anchors.fill: parent 
    resources: 
    { 
     var roleList = myModel.customRoleNames 
     var temp = [] 
     for(var i=0; i<roleList.length; i++) 
     { 
      var role = roleList[i] 
      temp.push(columnComponent.createObject(view, { "role": role, "title": role})) 
     } 
     return temp 
    } 

    model: myModel 

MyModel.h:

class MyModel: public QAbstractListModel 
{ 
    Q_OBJECT 
    Q_PROPERTY(QStringList userRoleNames READ userRoleNames CONSTANT) 

public: 
    explicit MyModel(QObject *parent = 0); 

    enum MyModelRoles { 
     UserRole1 = Qt::UserRole + 1, 
     UserRole2, 
     ... 
    }; 

    QStringList userRoleNames(); 
    int rowCount(const QModelIndex & parent = QModelIndex()) const; 
    QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const; 
    ... 

private: 
    QHash<int, QByteArray> roleNames() const; 
    ... 

}; 

MyModel.cpp:

... 
... 

QHash<int, QByteArray> MyModel::roleNames() const { 
    QHash<int, QByteArray> roles = QAbstractListModel::roleNames(); 
    roles[UserRole1] = "whatever"; 
    roles[UserRole2] = "youwant"; 
    return roles; 
} 

QStringList MyModel::userRoleNames() // Return ordered List of user-defined roles 
{ 
    QMap<int, QString> res; 
    QHashIterator<int, QByteArray> i(roleNames()); 
    while (i.hasNext()) { 
     i.next(); 
     if(i.key() > Qt::UserRole) 
      res[i.key()] = i.value(); 
    } 
    return res.values(); 
} 

... 
... 
+2

Mükemmel cevap! Belgeleri birazcık “kaynak” özelliğini bulmak için bulmam gerekti ve hatta bu şekilde kullanılabileceğini bilemezdim. – sjdowling