QML TableView из файла
Доброе утро,
У меня есть некоторые проблемы для создания таблицы из файла.
В основном у меня просто есть кнопка для загрузки 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);
если роль одна из ролей пользователя....
Это прекрасно работает для первого CSV-файла, который я загружаю в таблицу... Но после этого, когда я хочу загрузить другой файл, кажется, что roleNames не обновляются в 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
})
)
}
}
Вся остальная информация об использовании модели C++ в qml находится в документации Qt.