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.

Другие вопросы по тегам