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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: RelationalTableModel и ComboBox  (Прочитано 5792 раз)
svch
Гость
« : Декабрь 11, 2006, 13:01 »

Народ плиз помогите. Уменя есть RelationalTableModel как свызать связанное поле с QComboBox?
Код:
tableModel->setRelation(3, QSqlRelation("city", "id", "name"));

Т.е. когда я комбобоксе меняю значение результат сразу записывается в модель и меняется в таблице. Вообщем надо связать элемент таблицы с виджетом(Edit, ComboBox, SpinBox...). Ничего подобного в ассистанте не нашел!!!
Надеюсь на помощь...
Записан
bigirbis
Гость
« Ответ #1 : Декабрь 11, 2006, 17:57 »

Должно как-то через QSqlRelationalDelegate
Записан
Mikhail
Программист
*****
Offline Offline

Сообщений: 587


Просмотр профиля
« Ответ #2 : Декабрь 11, 2006, 20:33 »

Смотри примеры $(QTDIR)/examples/sql/relationaltablemodel
Записан
svch
Гость
« Ответ #3 : Декабрь 11, 2006, 21:27 »

Спасибо за ответы! СДЕЛАЛ. Нужно было написать правильный делигат. Если кому интересно он должен выглядеть примерно так... см. $(QTDIR)/src/sql/models/qsqlrelationaldelegate.h. (как здорово что QT опенсурсная, мужики!!!).

Помогите разобраться теперь как чтобы изменения в одной таблице сразу же отображались в зависимых от нее таблицах (QSqlRelationalTableModel). А то изменения вступают в силу только при перезапуске моей программы!!! :evil:
Записан
svch
Гость
« Ответ #4 : Декабрь 13, 2006, 21:35 »

Не понимаю после написанного ComboBoxDelegate см. $(QTDIR)/src/sql/models/qsqlrelationaldelegate.h измения в child-таблице появляются в ComboBoxDelegate и QTableView у родительской таблице только после перезапуска программы... В качестве СУБД юзается SQLite. Если делегат убрать то в родительской таблице отображаются изменения из child-таблице, как и должно??? Может кто делал что то похожее поделитесь опытом плиз!!! Буду рад:))
Записан
bigirbis
Гость
« Ответ #5 : Декабрь 13, 2006, 22:39 »

Очевидно, что делегат должен отлавливать что-то типа
void QAbstractItemModel::dataChanged ( const QModelIndex & topLeft, const QModelIndex & bottomRight )  [signal]
или же что-нибудь подобное...
Записан
-=s0L=-
Гость
« Ответ #6 : Июль 09, 2007, 17:26 »

я нашел правильное решение:
QDataWidgetMapper* map = new QDataWidgetMapper();
map->setModel(model);
map->setItemDelegate(new QSqlRelationalDelegate(this));
map->setSubmitPolicy(QDataWidgetMapper::AutoSubmit);

потом
combo->setModel(model->relationModel(ИНДЕКС ПОЛЯ С FK));
combo->setModelColumn(model->relationModel(ИНДЕКС ПОЛЯ С FK)->fieldIndex("имя колонки в связанной таблице"));

потом
map->addMapping(combo, ИНДЕКС ПОЛЯ С FK);

Все, в комбобоксе отображается нужная строчка и при изменении сразу отображается в связанном с моделью QTableVew, никаких своих делегатов не нужно.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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