QML TableView with dynamic number of columns

前端 未结 2 1127
[愿得一人]
[愿得一人] 2020-12-25 08:58

I have been trying to use a QML TableView to display a QAbstractTableModel. The missing part of the equation seems to be that it is not possible to

相关标签:
2条回答
  • 2020-12-25 09:09

    You could create dynamically as many TableViewColumn as you need, using the resources property of your TableView.

    You will have to add a method in your custom model class which will give you the roleNames you want to display.

    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();
    }
    
    ...
    ...
    
    0 讨论(0)
  • 2020-12-25 09:20

    The solution with resources does not work for me (Qt 5.6). The TableView is not updated.

    This works for me:

    Component{
        id: columnComponent
        TableViewColumn{width: 30 }
    }
    
    TableView {
        id: tableView
        model: listModel
        property var titles: somethingDynamic
        property var curTitles: {
            var t=[]
            for(var i=0;i<columnCount;i++){
                t.push(getColumn(i).title)
            }
            return t
        }
        onTitlesChanged:{
            for(var i=0;i<titles.length;i++){
                if(curTitles.indexOf(titles[i])==-1){
                    var column = addColumn(columnComponent) 
                    column.title=titles[i]
                    column.role=titles[i]                   
                }
            }
            for(var i=curTitles.length-1;i>=0;i--){
                if(titles.indexOf(curTitles[i])==-1){
                    removeColumn(i)
                }
            }
        }
    }
    

    }

    It also correctly updates drag-drop-reordered columns.

    0 讨论(0)
提交回复
热议问题