Russian Qt Forum

Qt => Вопросы новичков => Тема начата: BaSergey от Январь 29, 2014, 11:08



Название: Как сделать редактирование записи таблицы в окне диалога? Голову сломал :(
Отправлено: BaSergey от Январь 29, 2014, 11:08
Здравствуйте!
Видимо, я не понимаю чего-то принципиального, объясните, пожалуйста.

Есть QSqlTableModel + QTableView, мне надо отредактировать текущую запись в QDialog-е.

Пробовал вариант, когда в QDialog передается QRecord, потом значения полей записи вручную разбрасываются в виджеты, затем так же вручную обратно и запись возвращается в модель.
Это тупо работает, но если в диалоге используется QComboBox, которому передаётся отдельная модель для строк списка (setModel), я не знаю как получить значение ключа выбранной строчки (не индекс строки, а связанный с ним ключ), чтобы вернуть его в запись. Как?

Пробую через QDataWidgetMapper.
Где взять модель для него? Передать ссылку на ту же модель, что и для QTableView?
И как тогда выйти на редактирование выбранной записи? Я не нашёл ничего похожего на "текущую запись", как в VCL или ADO.NET. Краем глаза видел пример, когда модель фильтруется по ключу, но ведь тогда в списке тоже останется одна запись? (я не пробовал)
Или делать отдельную такую же модель для диалога?

У меня есть некоторый опыт в Delphi и Visual Studio (и, да, я стараюсь больше писать руками, а не в дизайнере), но Qt что-то ломает мне мозг... :(
Если дадите пример "вот список - щёлк - вот диалог - сохранить - вернулись в список" , я буду очень признателен.


Название: Re: Как сделать редактирование записи таблицы в окне диалога? Голову сломал :(
Отправлено: Hellraiser от Январь 29, 2014, 11:19
В модели комбика делаем выборку со всеми нужными нам полями
Код
C++ (Qt)
QSqlQueryModel *mdl = qobject_cast<QSqlQueryModel *>(ui.combo1->model());
if (!mdl) return;
QSqlRecord _rec = mdl->record(ui.combo1->currentIndex());
int _data1 = _rec.value(_rec.indexOf("field1")).toInt();
int _data2 = _rec.value(_rec.indexOf("field2")).toInt();
...
 
 
Ну а применить этот код можно, например, при сохранении данных по команде пользователя.


Название: Re: Как сделать редактирование записи таблицы в окне диалога? Голову сломал :(
Отправлено: Hellraiser от Январь 29, 2014, 11:24
Модель к комбику можно прикрутить, например, в конструкторе диалога.
Код
C++ (Qt)
QSqlQueryModel *mdl = new QSqlQueryModel(this);
mdl->setQuery("SELECT device_name, device_id, driver_id FROM view_system_drivers");
ui.combo1->setModel(mdl);
 


Название: Re: Как сделать редактирование записи таблицы в окне диалога? Голову сломал :(
Отправлено: BaSergey от Январь 29, 2014, 11:36
Hellraiser, спасибо!

Но это "ручной" способ.
А второй, через QDataWidgetMapper? Такое впечатление, что он в принципе есть, но толку от него мало...


Название: Re: Как сделать редактирование записи таблицы в окне диалога? Голову сломал :(
Отправлено: Bepec от Январь 29, 2014, 11:59
DataWidgetMapper плохо работает с комбиком. В паре моих проектов есть строчки тупо забивающие значение из комбика в запрос.


Название: Re: Как сделать редактирование записи таблицы в окне диалога? Голову сломал :(
Отправлено: BaSergey от Январь 29, 2014, 12:25
Всё понятно.
Укрепился во мнении, что всякие DataSet-ы годны только для чтения данных.
В остальном - запросы и процедуры наше всё.


Название: Re: Как сделать редактирование записи таблицы в окне диалога? Голову сломал :(
Отправлено: Old от Январь 29, 2014, 12:33
Укрепился во мнении, что всякие DataSet-ы годны только для чтения данных.
В остальном - запросы и процедуры наше всё.
Да. :)
Для остального еще можно попробовать разные ORM'ки, в том числе с использованием Qt. А можно все делать руками.