> There's nice qt docs example here: > http://doc.qt.nokia.com/4.7-snapshot/sql-sqlwidgetmapper.html > demonstrating QSqlRelationalTable, QDataWidgetMapper and QComboBox. > > They setup model: > ... > query.exec("create table person (id int primary key, " > "name varchar(20), address varchar(200), typeid int)"); > ... > query.exec("create table addresstype (id int, description > varchar(20))"); > ... > model = new QSqlRelationalTableModel(this); > model->setTable("person"); > model->setEditStrategy(QSqlTableModel::OnManualSubmit); > > typeIndex = model->fieldIndex("typeid"); > > model->setRelation(typeIndex, > QSqlRelation("addresstype", "id", "description")); > model->select(); > > and then setup mapper: > QSqlTableModel *relModel = model->relationModel(typeIndex); > typeComboBox->setModel(relModel); > typeComboBox->setModelColumn(relModel->fieldIndex("description")); > > mapper = new QDataWidgetMapper(this); > mapper->setModel(model); > mapper->setItemDelegate(new QSqlRelationalDelegate(this)); > mapper->addMapping(nameEdit, model->fieldIndex("name")); > mapper->addMapping(addressEdit, model->fieldIndex("address")); > mapper->addMapping(typeComboBox, typeIndex); > > > Here's the question: is there a way to filter typeComboBox items while > editing a record? Say, on button click. User clicks button and theres > types with some property only in typeComboBox. > I've tried two things: > 1) calling setFilter on relModel. This somehow "decouples" combobox > from mapper and no further updates from typeComboBox pass to model. > 2) setting typeComboBox::setModel() to relModel wrapped in > QSortFilterProxyModel. This causes invalid values to assigned. Say, > I picked second item in filtered list and mapper assigned second > item in not filtered list to model.
I managed to make it work. My solution is QSortFilterProxyModel and subclassed QComboBox with new user property and these setter-getter: QVariant MyComboBox::data() const { return = model()->data( model()->index(currentIndex(), <column-with-id-index>), Qt::EditRole ); } void MyComboBox::setData(const QVariant &d) { QModelIndexList list = model()->match( model()->index(0, modelColumn()/*note this is column-with-name-index*/), Qt::EditRole, d ); if(list.isEmpty()) { setCurrentIndex(-1); } else { setCurrentIndex(list.at(0).row()); } } Here's some more things I don't quite understand. 1) When I call QDataWidgetMapper setCurrentIndex and mapper populates widgets with data it calls MyComboBox::setData() passing it name from related table. Why it's name and not index? 2) When I edit form and pick different items from MyComboBox mapper performs calls to MyComboBox::setData and passes it index values (not names this time!). -- A: Because it messes up the order in which people normally read text. Q: Why is top-posting such a bad thing? A: Top-posting. Q: What is the most annoying thing in e-mail? _______________________________________________ Interest mailing list Interest@qt-project.org http://lists.qt-project.org/mailman/listinfo/interest