Russian Qt Forum

Qt => Базы данных => Тема начата: svch от Декабрь 11, 2006, 13:01



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

Т.е. когда я комбобоксе меняю значение результат сразу записывается в модель и меняется в таблице. Вообщем надо связать элемент таблицы с виджетом(Edit, ComboBox, SpinBox...). Ничего подобного в ассистанте не нашел!!!
Надеюсь на помощь...


Название: RelationalTableModel и ComboBox
Отправлено: bigirbis от Декабрь 11, 2006, 17:57
Должно как-то через QSqlRelationalDelegate


Название: RelationalTableModel и ComboBox
Отправлено: Mikhail от Декабрь 11, 2006, 20:33
Смотри примеры $(QTDIR)/examples/sql/relationaltablemodel


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

Помогите разобраться теперь как чтобы изменения в одной таблице сразу же отображались в зависимых от нее таблицах (QSqlRelationalTableModel). А то изменения вступают в силу только при перезапуске моей программы!!! :evil:


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


Название: RelationalTableModel и ComboBox
Отправлено: bigirbis от Декабрь 13, 2006, 22:39
Очевидно, что делегат должен отлавливать что-то типа
void QAbstractItemModel::dataChanged ( const QModelIndex & topLeft, const QModelIndex & bottomRight )  [signal]
или же что-нибудь подобное...


Название: RelationalTableModel и ComboBox
Отправлено: -=s0L=- от Июль 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, никаких своих делегатов не нужно.