来自文件的 QML TableView
QML TableView from file
早上好,
我在从文件创建 table 视图时遇到了一些问题。
基本上我只有一个按钮来加载 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() 我只是 return m_vv_table.at(index.row()).at(role);
如果角色是 UserRoles 之一....
这适用于我加载到 table 的第一个 csv 文件...
但在那之后,当我想加载另一个文件时,角色名称似乎没有在 QML 中更新。
我已经尝试了几种组合来解决问题......这也是我目前没有好的代码示例的原因,它有点混乱......
我可能走错了路我无法想象加载一些简单的文件会如此复杂....这让我抓狂
如果有人只是给出提示或一个小示例,如何加载具有动态数量的列的文件,那就太棒了。
亲切的问候,
萌
您可以根据模型更改事件动态添加列。
我的项目示例:
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 文档中。
早上好,
我在从文件创建 table 视图时遇到了一些问题。
基本上我只有一个按钮来加载 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() 我只是 return m_vv_table.at(index.row()).at(role);
如果角色是 UserRoles 之一....
这适用于我加载到 table 的第一个 csv 文件... 但在那之后,当我想加载另一个文件时,角色名称似乎没有在 QML 中更新。 我已经尝试了几种组合来解决问题......这也是我目前没有好的代码示例的原因,它有点混乱......
我可能走错了路我无法想象加载一些简单的文件会如此复杂....这让我抓狂
如果有人只是给出提示或一个小示例,如何加载具有动态数量的列的文件,那就太棒了。
亲切的问候,
萌
您可以根据模型更改事件动态添加列。
我的项目示例:
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 文档中。