Russian Qt Forum
Сентябрь 29, 2024, 06:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QTableWidget и запись в БД  (Прочитано 12219 раз)
skydion
Гость
« : Февраль 21, 2010, 11:24 »

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

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

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

Но чую что это не совсем правильный подход.
У кого какие будут мысли на счет всего этого???
Записан
Karl-Philipp
Гость
« Ответ #1 : Февраль 21, 2010, 12:21 »

Посмотрите примеры из qt/examples/sql, думаю там все то, что Вам нужно Подмигивающий
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #2 : Февраль 21, 2010, 13:48 »

треш - я даже не понял у вас TableView или TableWidget - то один то другой упоминаете...

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

в общем офф. документация + примеры
Записан
skydion
Гость
« Ответ #3 : Февраль 21, 2010, 13:56 »

QTableWidget Улыбающийся

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

Сообщений: 846


Просмотр профиля
« Ответ #4 : Февраль 21, 2010, 14:17 »

Цитировать
Для себя вроде решил, что писать каждую ячейку из таблицы в отдельную таблицу БД выгоднее чем все это кодировать раскодировать в строчку... Сейчас буду пробовать все это дело замутить...
охренеть....
может лучше почитать доку и воспользоваться QSqlTableModel + QTableView чем х....ню городить?
Записан
skydion
Гость
« Ответ #5 : Февраль 21, 2010, 15:25 »

Сижу читаю  Смеющийся

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

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

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

Вот и спрашивал правильно я думаю или нет Улыбающийся возможно я что-то не понимаю, тогда подскажите.
« Последнее редактирование: Февраль 21, 2010, 16:37 от skydion » Записан
skydion
Гость
« Ответ #6 : Февраль 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();

но меня не интересует эта таблица, а меня интересует та которую создает пользователь и которую я хочу записать и считать из БД.
« Последнее редактирование: Февраль 21, 2010, 16:39 от skydion » Записан
skydion
Гость
« Ответ #7 : Февраль 21, 2010, 17:37 »

Вот приведу рисунок, а то видимо всех запутал уже Улыбающийся
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #8 : Февраль 21, 2010, 20:42 »

понятно!
можно так:

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

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #9 : Февраль 21, 2010, 20:43 »

Вот приведу рисунок, а то видимо всех запутал уже Улыбающийся
и че сложного?
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
skydion
Гость
« Ответ #10 : Февраль 21, 2010, 21:10 »

понятно!
можно так:

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

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

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

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

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

ПС. Ну а если делать свою модель, с чего начать? Хотелось бы как-то грамотно все сделать  Подмигивающий или всетаки отдельно модель, а отдельно запросы в БД это тоже нормально?
« Последнее редактирование: Февраль 21, 2010, 21:16 от skydion » Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #11 : Февраль 21, 2010, 22:12 »

Мне кажется "шахматка" не соответствует формату данных хранимых в БД - то есть не табличная она. Поэтому может в прямой модели смысла и нет. т.к. данные все равно преобразовываются в табличный вид и обратно. А может логичнее в своей модели для шахматки сделать функции saveToDB() loadFromDB().

proxyModel к TableWidget не привязывается никак - она привязывается к другой модели и все это отображается во View а не Widget варианте таблицы.
Записан
skydion
Гость
« Ответ #12 : Февраль 21, 2010, 22:16 »

Да нет шахматки у меня не будет я же говорю это пример чтобы можно было показать что я хочу...

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

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

Сообщений: 846


Просмотр профиля
« Ответ #13 : Февраль 21, 2010, 22:35 »

морской бой - это шахматка
TableWidget - это не MVC
Записан
skydion
Гость
« Ответ #14 : Февраль 22, 2010, 09:46 »

Спасибо за участие )
про QTableWidget уже дочитался...
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.051 секунд. Запросов: 23.