文件

时间:2017-10-27 09:47:23

标签: c++ qt qml tableview qabstracttablemodel

早上好,

我有一些问题需要从文件创建一个tableview。

基本上我只有一个Button来加载csv文件,我想在QML TableView中显示文件...

我认为我的主要问题是我有一个动态数量的列。

TableView
{
    id: tableView

    enabled:                dynVars.csvVarTableModel.b_csvEnabled
    frameVisible:           false
    sortIndicatorVisible:   false

    model:                  dynVars.csvVarTableModel

    resources:
    {
        var roleList = dynVars.csvVarTableModel.roleStringList
        var temp = []
        for(var i=0; i<roleList.length; i++)
        {
            var role  = roleList[i]
            temp.push(columnComponent.createObject(tableView, { "role": role, "title": role}))}
            return temp
        }
    }    
}

columnComponent只是一个简单的TableViewColumn ... 我使用了QAbstractTableModel。到目前为止,我完成了所有基本的工作,我重新实现了以下功能:

public:
        int         rowCount    (const QModelIndex &parent = QModelIndex()) const;
        int         columnCount (const QModelIndex &parent = QModelIndex()) const;
       // QVariant    headerData(int section, Qt::Orientation orientation, int role) const;
        QVariant    data(const QModelIndex & index, int role = Qt::DisplayRole) const;
    private:
        QHash<int, QByteArray> roleNames() const;

我试图重载roleNames函数,以便我为每个Column都有一个角色。这就是我对文档的理解......

QHash<int,QByteArray> CSVVarTableModel::roleNames() const
{
    QHash<int, QByteArray> roles = QAbstractTableModel::roleNames();
    for(int i = 0; i < m_v_headers.size();i++)
        roles[i + Qt::UserRole] = m_v_headers.at(i).toLatin1();
    return roles;
}
数据()中的

我只返回m_vv_table.at(index.row()).at(role); 如果角色是UserRoles之一......

这适用于我加载到表的第一个csv文件... 但在那之后,当我想加载另一个文件时,似乎在QML中没有更新roleNames。 我已经尝试了几种组合来解决这个问题......这也是为什么我现在没有一个好的代码示例,它有点混乱... < / p>

我可能完全错误的方式,我无法想象加载一些简单的文件是如此复杂......这让我发疯了

如果有人给出提示或一个小例子,如何加载具有动态数量的colums的文件,那将是非常棒的。

亲切的问候,

1 个答案:

答案 0 :(得分:1)

您可以在模型更改事件中动态添加列。

我的项目示例:

            onModelChanged: {
            for(var index = tableView.columnCount-1; index>=0; index--) {
                tableView.removeColumn(index)
            }
            for(var i = 0; i< model.columnCount(); i++) {
                tableView.addColumn(columnComponent.createObject(
                    {                                                                        
                        "title":model.headerData(i, 1).toString(),                                                                       
                        "role":model.headerData(i, 1).toString(),                                                                        
                        "delegate": textDelegate,
                        "movable": false
                    })
                )
            }

        }

有关在qml中使用c ++模型的所有其他信息都在Qt文档中。