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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как сделать редактирование записи таблицы в окне диалога? Голову сломал :(  (Прочитано 2647 раз)
BaSergey
Гость
« : Январь 29, 2014, 11:08 »

Здравствуйте!
Видимо, я не понимаю чего-то принципиального, объясните, пожалуйста.

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

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

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

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

Сообщений: 451


Просмотр профиля
« Ответ #1 : Январь 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();
...
 
 
Ну а применить этот код можно, например, при сохранении данных по команде пользователя.
Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #2 : Январь 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);
 
Записан
BaSergey
Гость
« Ответ #3 : Январь 29, 2014, 11:36 »

Hellraiser, спасибо!

Но это "ручной" способ.
А второй, через QDataWidgetMapper? Такое впечатление, что он в принципе есть, но толку от него мало...
Записан
Bepec
Гость
« Ответ #4 : Январь 29, 2014, 11:59 »

DataWidgetMapper плохо работает с комбиком. В паре моих проектов есть строчки тупо забивающие значение из комбика в запрос.
Записан
BaSergey
Гость
« Ответ #5 : Январь 29, 2014, 12:25 »

Всё понятно.
Укрепился во мнении, что всякие DataSet-ы годны только для чтения данных.
В остальном - запросы и процедуры наше всё.
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



Просмотр профиля
« Ответ #6 : Январь 29, 2014, 12:33 »

Укрепился во мнении, что всякие DataSet-ы годны только для чтения данных.
В остальном - запросы и процедуры наше всё.
Да. Улыбающийся
Для остального еще можно попробовать разные ORM'ки, в том числе с использованием Qt. А можно все делать руками.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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