Russian Qt Forum

Qt => Базы данных => Тема начата: skydion от Февраль 21, 2010, 11:24



Название: QTableWidget и запись в БД
Отправлено: skydion от Февраль 21, 2010, 11:24
Ребятя вот такая проблемка, есть QTableWidget пользователь может добавлять/удалять строчки и столпцы, незнаю как записывать все это в БД...

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

2. еще есть идея записать все это дело в отдельную таблицу получив rows x columns записей, только в этом случае возникает вопрос как потом читать все в таблицу чтобы отображать в QTableView можно сделать выборку всех строк и столбцов и через цыкл записывать в ячейки модели )

Но чую что это не совсем правильный подход.
У кого какие будут мысли на счет всего этого???


Название: Re: QTableWidget и запись в БД
Отправлено: Karl-Philipp от Февраль 21, 2010, 12:21
Посмотрите примеры из qt/examples/sql, думаю там все то, что Вам нужно ;)


Название: Re: QTableWidget и запись в БД
Отправлено: break от Февраль 21, 2010, 13:48
треш - я даже не понял у вас TableView или TableWidget - то один то другой упоминаете...

QSqlTableModel + QTableView решает все проблемы без всяких велосипедов

в общем офф. документация + примеры


Название: Re: QTableWidget и запись в БД
Отправлено: skydion от Февраль 21, 2010, 13:56
QTableWidget :)

Для себя вроде решил, что писать каждую ячейку из таблицы в отдельную таблицу БД выгоднее чем все это кодировать раскодировать в строчку... Сейчас буду пробовать все это дело замутить...


Название: Re: QTableWidget и запись в БД
Отправлено: break от Февраль 21, 2010, 14:17
Цитировать
Для себя вроде решил, что писать каждую ячейку из таблицы в отдельную таблицу БД выгоднее чем все это кодировать раскодировать в строчку... Сейчас буду пробовать все это дело замутить...
охренеть....
может лучше почитать доку и воспользоваться QSqlTableModel + QTableView чем х....ню городить?


Название: Re: QTableWidget и запись в БД
Отправлено: skydion от Февраль 21, 2010, 15:25
Сижу читаю  ;D

Но! вопрос не в том как и чем отображать, а в том как лучше всего сохранять таблицу, я вот не представляю, или представляю не так как Вы, как сохранять таблицу размеры которой зависят от пользователя.

Вот берем пример,
пользователь открывает окно, задает 10 строк и 20 столбцов, вводит какие-то даные в эту таблицу. Скажем через QTableWidget я это реализовал.
Тепер главный вопрос как через модель сохранить/загрузить эту таблицу в БД?

Я уже писал, что представляю это как отдельную таблицу куда через модель записываем numRows * numCols записей.

Вот и спрашивал правильно я думаю или нет :) возможно я что-то не понимаю, тогда подскажите.


Название: Re: QTableWidget и запись в БД
Отправлено: skydion от Февраль 21, 2010, 15:45
Вот сделал такой класс

Код:
class TemplateModel : public QSqlTableModel
{
Q_OBJECT
public:
    explicit TemplateModel(QObject *parent = 0);

    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
};

TemplateModel::TemplateModel(QObject *parent) :
    QSqlTableModel(parent)
{

    не думаю что запрос должен быть тут.......

Код:
    QSqlQuery query;
    query.exec("select _rows, _columns from templates;");
}

QVariant TemplateModel::data(const QModelIndex &index, int role) const
{
    QVariant value = QSqlQueryModel::data(index, role);
    QFont font;

    switch (role) {
    case Qt::DisplayRole: // Данные для отображения

    case Qt::TextAlignmentRole: // Выравнивание
return Qt::AlignCenter;
break;

    case Qt::FontRole: // Шрифт
font = QFont("Helvetica", 10, QFont::Bold);
return qVariantFromValue(font);
break;

    case Qt::BackgroundColorRole: // Цвет фона
return qVariantFromValue(QColor(220,240,230));
break;
    }

    return value;
}

дальше

Код:
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

   QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");

    db.setHostName("localhost");
    db.setDatabaseName("test");
    db.setUserName("root");
    db.setPassword("test");

    bool connected = db.open();

    if (!connected) {
QMessageBox::critical(parent, QObject::tr("Database Error"), db.lastError().text());
    }

    model = new TemplateModel(this);
    
    if (model)
ui->tableView->setModel(model);
}

вот теперь как в модели выбрать даные для отображения?

я понимаю что вы имеет в виду сделать так
    model->setTable("templates");
    model->select();

но меня не интересует эта таблица, а меня интересует та которую создает пользователь и которую я хочу записать и считать из БД.


Название: Re: QTableWidget и запись в БД
Отправлено: skydion от Февраль 21, 2010, 17:37
Вот приведу рисунок, а то видимо всех запутал уже :)


Название: Re: QTableWidget и запись в БД
Отправлено: break от Февраль 21, 2010, 20:42
понятно!
можно так:

QStandartItemModel (или свой более производительный вариант наследник QAbstractItemModel) хранит в себе таблицу "шахматку" прямо по строкам и столбцам (т.е. просто модель не привязанная к БД). Чтение и запись производятся отдельными методами через вызовы QSqlQuery внтури которых просто проход сначала по столбцам, а потом по строкам. И все это также отображается в TableView.


Название: Re: QTableWidget и запись в БД
Отправлено: panAlexey от Февраль 21, 2010, 20:43
Вот приведу рисунок, а то видимо всех запутал уже :)
и че сложного?


Название: Re: QTableWidget и запись в БД
Отправлено: skydion от Февраль 21, 2010, 21:10
понятно!
можно так:

QStandartItemModel (или свой более производительный вариант наследник QAbstractItemModel) хранит в себе таблицу "шахматку" прямо по строкам и столбцам (т.е. просто модель не привязанная к БД). Чтение и запись производятся отдельными методами через вызовы QSqlQuery внтури которых просто проход сначала по столбцам, а потом по строкам. И все это также отображается в TableView.

Ну шахматка это так пример ))
в таблице может быть выбрано несколько ячеек подряд по столпцу или по строке...

Если я правильно понял, то делаем QStandartItemModel клас, потом задаем количество столбцов и строк, инициализируем таблицу через
цикл строк * столбцы в каждуюю ячейку записываем QStandardItem.

Далее когда делаем выборку даних из таблицы просто через тотже цикл меняем ячейки на даные из выборки, так???

Вообще я думал прокси модель подключить, но пока не разобрался как подключать прокси модель к QTableWidget, а в QTableView тоже много с чем не разобрался  ;D короче читаю...

ПС. Ну а если делать свою модель, с чего начать? Хотелось бы как-то грамотно все сделать  ;) или всетаки отдельно модель, а отдельно запросы в БД это тоже нормально?


Название: Re: QTableWidget и запись в БД
Отправлено: break от Февраль 21, 2010, 22:12
Мне кажется "шахматка" не соответствует формату данных хранимых в БД - то есть не табличная она. Поэтому может в прямой модели смысла и нет. т.к. данные все равно преобразовываются в табличный вид и обратно. А может логичнее в своей модели для шахматки сделать функции saveToDB() loadFromDB().

proxyModel к TableWidget не привязывается никак - она привязывается к другой модели и все это отображается во View а не Widget варианте таблицы.


Название: Re: QTableWidget и запись в БД
Отправлено: skydion от Февраль 21, 2010, 22:16
Да нет шахматки у меня не будет я же говорю это пример чтобы можно было показать что я хочу...

Модель будет сложнее, буду сохраняться наборы ячеек или солпцов в зависимосит что буде выбрано,
ну примерно так как в игре морской бой  ;)

Ну насчет saveToDB(), loadFromDB(),  я уже такое думал, только незнаю идет оно в разрез с MVC или нет.
Ну и прокси модели тоже понятно, только не понятно почему они не могут присоединяться к QTableWidget,
он меня пока что во всем устраивает...


Название: Re: QTableWidget и запись в БД
Отправлено: break от Февраль 21, 2010, 22:35
морской бой - это шахматка
TableWidget - это не MVC


Название: Re: QTableWidget и запись в БД
Отправлено: skydion от Февраль 22, 2010, 09:46
Спасибо за участие )
про QTableWidget уже дочитался...


Название: Re: QTableWidget и запись в БД
Отправлено: Karl-Philipp от Февраль 25, 2010, 21:22
морской бой - это шахматка
TableWidget - это не MVC
Как это TableWidget не MVC? Таблица - это же контрол вида, еще и для моделей. Объясни, пожалуйста :)


Название: Re: QTableWidget и запись в БД
Отправлено: MoPDoBoPoT от Февраль 25, 2010, 22:27
Как это TableWidget не MVC?
QTableWidget агрегирует в себе модель и представление, а MVC, собственно, предполагает разделение хранение данных и их представление.


Название: Re: QTableWidget и запись в БД
Отправлено: Karl-Philipp от Февраль 25, 2010, 22:55
спасибо :)