воскресенье, 21 октября 2012 г.

Создание модели на базе QAbstractTableModel для QTableView

Существует множество способов вывести табличные данные. Один из таких способов (и на мой взгляд наиболее правильный) выводить данные в QTableView. Для данного виджета существует специальная модель данных QAbstractTableModel. На её базе мы и сделаем пример.

Как всегда, вначале создадим Gui приложение Qt, всё как обычно.
Далее мы создадим нашу модель данных на базе QAbstractTableModel:



Для простого отображения данных нам необходимо переопределить 3 метода. Сразу объявим их в mytablemodel.h :
private:
    int rowCount(const QModelIndex &parent) const;
    int columnCount(const QModelIndex &parent) const;
    QVariant data(const QModelIndex &index, int role) const;

Соответственно нам необходимо написать определение всех 3-х функций. Я сделаю максимально упрощенно, дабы не нагромождать код возможными структурами данных. Вы же можете использовать QList, QVector, или что вашей душе угодно :).
Для методов rowCount и columnCount я сделал всё предельно просто:
int myTableModel::rowCount(const QModelIndex &parent) const
{
    return 5; // сделаем фиксированно 5 строк в таблице
    //если вы станете использовать скажем QList, то пишите return list.size();
}
int myTableModel::columnCount(const QModelIndex &parent) const
{
    return 4; // количество колонок сделаем также фиксированным
}

Последний метод возвращает необходимые данные объектом класса QVariant (не забудьте подключить его в заголовочном файле):
QVariant myTableModel::data(const QModelIndex &index, int role) const
{
    if (role == Qt::DisplayRole) {
        QString unswer = QString("row = ") + QString::number(index.row()) + "  col = " + QString::number(index.column());
        // строкой выше мы формируем ответ. QString::number преобразует число в текст
        return QVariant(unswer);
    }
    return QVariant();
}

Теперь осталось дело за малым: создать экземпляр класса и установить его в качестве модели для QTableView.

- Добавьте на форме mainwindow.ui виджет QTableView.
- В mainwindow.h подключите наш класс:
#include "mytablemodel.h"
- Ну и последнее, создайте и установите экземпляр класса в конструкторе mainwindow:
    myTableModel *myModel = new myTableModel();
    ui->tableView->setModel(myModel);
После запуска получим таблицу с данными:






2 комментария: