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);, если роль является одной из UserRoles....

Это отлично работает для первого CSV-файла, который я загружаю в таблицу... Но после этого, когда я хочу загрузить другой файл, кажется, что имена ролей не обновляются в QML. Я уже пробовал несколько комбинаций, чтобы решить проблему... по этой же причине у меня сейчас нет хорошего примера кода, все немного запутано...

Я, наверное, на совершенно неправильном пути, я не могу представить, что так сложно загрузить некоторые простые файлы .... это сводит меня с ума.

Было бы здорово, если бы кто-нибудь просто дал подсказку или небольшой пример, как загрузить файл с динамическим количеством столбцов.

с уважением,

Мо


person mBucks    schedule 27.10.2017    source источник
comment
Я думаю, вы имеете в виду QAbstractTableModel, потому что QAbstractTableView нет? QAbstractItemModel::roleNames() не следует изменять, он просто возвращает отображаемые роли, а не фактические заголовки столбцов, которые отображаются с табличным представлением, для этого вы должны реализовать QAbstractItemModel::headerData. Обратитесь к документации для получения дополнительной информации о данных заголовка.   -  person xander    schedule 27.10.2017
comment
Привет, спасибо, да, вы правы, я имею в виду QAbstractTableModel... mhh, я уже пробовал это, но если я правильно помню, headerData не вызывался, когда я пробовал это... Я попробую еще раз, может быть, я упустил что-то   -  person mBucks    schedule 27.10.2017
comment
Я не уверен, использует ли QML TableView его, но обычно он должен, потому что это правильный способ указать имена заголовков столбцов. Возможно, создайте небольшой новый проект, чтобы протестировать только TableView с простым QAbstractTableModel и посмотреть, как они работают вместе. К сожалению, у меня нет доступа к банкомату среды разработки Qt, чтобы проверить это.   -  person xander    schedule 27.10.2017
comment
Ммм, спасибо за совет... Теперь у меня есть небольшой проект для таблицы. Но, к сожалению, я не думаю, что headerData решит проблему для QML... Согласно замечательной документации, я думаю, что должен определить роль для каждого столбца... Разделы заголовков привязаны к значениям в модели определяя модельную роль, к которой они присоединяются. Каждое свойство в модели будет отображаться в соответствующем столбце.   -  person mBucks    schedule 27.10.2017


Ответы (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.

person Andrey Semenov    schedule 30.10.2017