Выкладываю два класса: QTable и QTableModel.
Первый - собственно для работы, второй - для вьюеров.
QTable по сути является обёрткой для табличных моделей для более простого доступа. Если его просто создать, то он создаёт для себя табличную модель по-дефолту, используя класс QTableModel.
QTableModel - это по сути таблица QVariant'ов, завёрнутая в модель.
Вот несколько вариантов использования:
"Вариант 1"
static QTable table;
ui->tableView->setModel( table.model() );
table.setColumnCount(3);
table.setColumnHeaders( QTableLine( "ФИО", "Заказ", "Стоимость" ) );
table.appendRow( QTableLine( "В. Пупкин", "Велосипед", "6550" ) );
table.appendRow( QTableLine( "И. Иванов", "Футболка", "500" ) );
int sum = table.value(0,2).toInt() + table.value(1,2).toInt();
"Вариант 2"
static QTable table( 2, 3 );
table.setColumnHeader( 0, "ФИО" );
table.setColumnHeader( 1, "Заказ" );
table.setColumnHeader( 2, "Стоимость" );
table.set( 0, 0, "В. Пупкин" );
table.set( 0, 1, "Велосипед" );
table.set( 0, 2, "6550" );
table.replaceRow( 1, QTableLine( "И. Иванов", "Футболка", "500" ) );
// Копирование строки
table.setRow( 1, table.row(0) );
// Подключаем таблицу к вьюеру
ui->tableView_answers->setModel( table.model() );
QTable можно использовать для доступа к другим моделям. Например для доступа к модели QFileSystemModel:
"Пример использования совместно с QFileSystemModel. Основное написано в слоте my_on_root_changed"
"dialog.cpp"
#include "dialog.h"
#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
ui->tableView->setModel( &model );
connect( &model, SIGNAL(rootPathChanged(QString)), this, SLOT(my_on_root_changed(QString)) );
model.setRootPath( "C:/Projects" );
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::my_on_root_changed( QString dir )
{
//ui->tableView->setModel( &model );
qDebug() << "Content of : " << dir;
qDebug() << "";
QTable table( &model );
qDebug() << table.columnCount() << "x" << table.rowCount();
qDebug() << table.row(0).cells();
}
"dialog.h"
#ifndef DIALOG_H
#define DIALOG_H
#include <QtCore>
#include <QtGui>
#include "qtable.h"
namespace Ui {
class Dialog;
}
class Dialog : public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = 0);
~Dialog();
private slots:
void my_on_root_changed( QString dir );
private:
Ui::Dialog *ui;
QFileSystemModel model;
};
#endif // DIALOG_H
Ещё в теории можно выбрать какой-нибудь индекс модели в качестве рутового для таблицы. Это чтобы можно было и с деревом поработать немного. Но на практике это не тестировалось...
Подход по-идее такой:
"другой рутовый элемент"
QTable table( &model );
table.setParent( model.index(0,0) );
Ещё сделана возможность указывать роли при обращении к данным. Но (возможно даже "пока что") поддержка разных ролей не реализована в дефолтной модели QTableModel. А вот с другими моделями в теории может даже работать, но опять же не тестировалось...
"роли"
table.set( 0, 0, QBrush(QColor(Qt::green)), Qt::BackgroundRole );
table.setRow( 0, QTableLine( QBrush(QColor(Qt::green)), QBrush(QColor(Qt::red)) ), Qt::BackgroundRole );
Вот примерно что-то такое. Может быть кому-нибудь понадобится.
Лицензия: LGPL.
Исходники приложены.
Прошу извинить, если не туда положил. У меня ещё мало опыта в выкладывании кодов, потому я не знаю как лучше это делать.
По-идее (если идея была правильной), новичку в мире Qt это должно несколько облегчить жизнь.