来自文件的 QML TableView

Posted

技术标签:

【中文标题】来自文件的 QML TableView【英文标题】:QML TableView from file 【发布时间】:2017-10-27 09:47:23 【问题描述】:

早上好,

我在从文件创建表格视图时遇到了一些问题。

基本上我只有一个按钮来加载 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 函数,以便我为每个列都有一个角色。这就是我理解文档的方式......

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;

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

这适用于我加载到表中的第一个 csv 文件... 但在那之后,当我想加载另一个文件时,QML 中的角色名称似乎没有更新。 我已经尝试了几种组合来解决问题...这也是我目前没有好的代码示例的原因,这一切都有些混乱...

我可能走错路了,我无法想象加载一些简单的文件会如此复杂......这让我抓狂

如果有人只是给出提示或一个小例子,那就太棒了,如何加载具有动态列数的文件。

亲切的问候,

【问题讨论】:

我猜你的意思是QAbstractTableModel,因为没有QAbstractTableViewQAbstractItemModel::roleNames() 不应更改,它只返回显示角色,而不是使用表格视图显示的实际列标题,因为您应该实现 QAbstractItemModel::headerData。查看文档以获取有关“标头数据”的更多信息。 嗨,谢谢,是的,你是对的,我的意思是 QAbstractTableModel...mhh 我已经尝试过了,但是如果我记得没错,当我尝试那个时,headerData 没有被调用...我会再试一次,也许我忽略了一些东西 我不确定 QML TableView 是否使用它,但通常它应该使用它,因为这是提供列标题名称的正确方法。也许创建一个新的小项目,用一个简单的QAbstractTableModel 只测试TableView,看看它们是如何协同工作的。遗憾的是,我无法访问 Qt 开发环境 atm 来测试它。 嗯谢谢你的建议...现在我有一个小项目的表。但不幸的是,我认为 headerData 不会解决 QML 的问题...根据“精彩”文档,我认为我必须为每一列定义一个角色... 标题部分附加到中的值通过定义他们附加的模型角色来构建模型。模型中的每个属性都将显示在相应的列中。 【参考方案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 文档中。

【讨论】:

以上是关于来自文件的 QML TableView的主要内容,如果未能解决你的问题,请参考以下文章

Qt QML包含来自不同目录的问题

来自文件的 QML TableView

来自 QPixmap 的 QML 背景

来自 Qt 的 QML 未定义变量

来自 C++ 插件的 QML 类型仅发出一次信号

来自模型的 QML 树视图