Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: QTable
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Модель/Представление
Frigolem
В общем, попытался немного упростить ( или усложнить :) ) работу с таблицами в самых простых случаях.

Выкладываю два класса: 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 это должно несколько облегчить жизнь. :)
wiz29
а чем QStandardItemModel и QTableView не устраивает?
Frigolem
Насколько я знаю, в QStandardItemModel каждый элемент нужно создавать отдельно:
QStandardItemModel model(4, 4);
for (int row = 0; row < 4; ++row) {
     for (int column = 0; column < 4; ++column) {
         QStandardItem *item = new QStandardItem(QString("row %0, column %1").arg(row).arg(column));
         model.setItem(row, column, item);
     }
}
Поэтому, если нужно создать простейшую таблицу и накидать в неё данных из какого-нибудь списка, тогда требуется писать конвертер из списка элементов в строку/колонку таблицы.
В приложенном классе можно кинуть список сразу:
table.setRow( 0, QTableLine( my_list ) );


При этом задача замены QStandardItemModel не ставится. QTable в данном случае скорее является дополнением. При этом если нужны дополнительные функции QStandardItemModel, тогда можно просто сделать так:
QStandardItemModel model;
QTable table( &model );

В таком случае удобно работать с данными через table и производить дополнительную настройку отображения/поведения через саму model.

QTableView для отображения здесь используется в любом случае.
wiz29
Цитата(Frigolem @ 1.2.2012, 11:59) *
Насколько я знаю, в QStandardItemModel каждый элемент нужно создавать отдельно


не обязательно, можно создать строку и забивать в нее значения.

bool QAbstractItemModel::insertRow(...) никто не отменял:)

просто небольшая обертка над интерфейсом QStandartItemModel и упростит работу касающуюся таблиц, но она сама по сути "заточена" под табличное представление данных.

на мой взгляд для новичков гораздо важнее "впитать" идеи архитектуры модель-представление, обертки этому не способствуют.
Frigolem
Цитата(wiz29 @ 1.2.2012, 13:22) *
просто небольшая обертка над интерфейсом QStandartItemModel и упростит работу касающуюся таблиц, но она сама по сути "заточена" под табличное представление данных.
Ну да :) именно это и делалось :rolleyes:
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.