Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Аналог DataTable из .NET в Qt


Автор: franzR 31.5.2011, 15:42
Интересует таблица в которую можно в ручную внести данные не связывая ни с какой SQL таблицей или чем то прочим. 

Знаю что есть QSqlTableModel, но она заточена для манипулирования данными в SQL таблице. Вот как в .NET DataTable. Интересует такой аналог по простой причине, чтоб можно было делать Select из такой таблицы как в .NET DataTable, быстрое перемещение по данным и такая же быстрая их обработка.

Автор: Artemon 31.5.2011, 16:24
QTableWidget

Автор: franzR 3.6.2011, 16:22
Хорошо если его использовать как скрытый компонент, то согласен. А если мне нужно потом вывести все это на форму:
в .NET это делается так 

Код

DataGridView dgv = new DataGridView();

DataTable dt = new .... bla bla;

dgv.DataSource = dt;


и все, все шлепнулось на форму. 

Возможно ли в Qt проделать что то вроде такого?


Автор: bsa 3.6.2011, 17:13
Любой наследник QWidget (QTableWidget в том числе) может быть помещен на форму. Более того, может быть сам формой!
Код
QWidget *form;
QTableWidget *table;
...
table->setParent(form);

Автор: math64 3.6.2011, 21:52
В Qt это делается так:
Код

class MyTableModel : public QAbstractTableModel {
...
};

MyTableModel* model = new MyTableModel();
table->setModel(model);


Автор: borisbn 4.6.2011, 08:34
Цитата(math64 @  3.6.2011,  21:52 Найти цитируемый пост)
В Qt это делается так:

зачем, если
Цитата(franzR @  31.5.2011,  15:42 Найти цитируемый пост)
Интересует таблица в которую можно в ручную внести данные не связывая ни с какой SQL таблицей или чем то прочим. 


Artemon дал ответ. первым же сообщением - QTableWidget.
Если же таблица будет большая, сложная, с возможностью сортировки, подсветки строки в зависимости от одного поля и т.п., то да, нужно наследоваться от модели и переписывать ф-цию data.

Автор: franzR 17.6.2011, 18:16
Добрый день. Может нужно бы создать новую тему но все же попробую спросить еще в этой.

Спасибо за совет с QTableWidget, немного разобрался.

Теперь вопрос следующего характера.

Вот на форме добавляются данные пользователем в QTableWidget в которой cellWidget, благо, позволяет добавить в себя различные виджеты, и я использую там много QComboBox-ов. Вычитывание из SQLITE базы проходит отлично и я заполняю табличку данными и комбо боксы выставлены в нужных позициях, и все хорошо когда нужен SELECT или INSERT. Но вот теперь чтоб UPDATE сделать т.е. все эти выбранные из базы и намодифицированные пользователем  данные снова легли в базу не могу понять как его сделать.

Увидел возможность работать с моделью "Model-Based" как то так
Код

QSqlTableModel *model = new QSqlTableModel(this,Sql->GetDatabase());
model->setTable("users");
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
model->select();

ui->tableView->setModel(model); //и тут все вытащилось в табличку на форме и даже позволяет редактировать и применять изменения таблице прямо в базу



Казалось бы идеальный вариант... И в QTableWidget есть setModel() но он приватный и юзать его нельзя. Пошерстив в инете пока не смог найти как бы его прикрутить данные из моего уже хорошо редактируемого QTableWidget  в QSqlTableModel чтоб та, прекрасно себе приняла изменения и внесла их в базу....

Пока на ум приходит одно решение, сравнивать выбранные данные из QSqlTableModel с теми что отредактированные были QTableWidget пользователем, а уже перед занесением изменений, менять в ручную QSqlTableModel  и делать submitAll ()...

Но мне кажется что это мартышкин труд, подскажите пожалуйста как это сделать правильно? 

Автор: Greeneyed 17.6.2011, 21:36
По хорошему тебе надо было пользоваться QTableView, чтобы можно было его легко связать с моделью. А для вставки в таблицу комбобоксом, нужно было написать свой делегат. В делегате нужно было бы переопределить методы редактирования и, если ты хочешь отображать комбобокс в режиме просмотра, переопределить paint() .

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)