Qt эквивалент привязки данных .NET?

Есть ли эквивалент привязки данных .NET в Qt?

Я хочу заполнить некоторые комбинированные поля и другие виджеты с помощью QStrings, которые относятся к конкретным объектам в моей базе данных. Тем не менее, было бы более чистым, если бы я мог привязать данные к этим строкам, а не снова запрашивать базу данных, основываясь на новом выборе combobox или какой-либо другой схеме, основанной на создании моего собственного индекса объектов, который будет искать с помощью QStrings.

Лучшее, что я придумал, состоит в том, чтобы вывести эти сущности из QString и вытолкнуть их в виджеты таким образом, но я еще не попробовал это. Я не уверен, что он будет работать так, как я хочу, и это похоже на неприятный взлом.

Если нет привязки данных, что вы предлагаете?

Спасибо.

Ответы

Ответ 1

Ну, специально для combobox вы можете установить модель. Для QObjects в целом вы можете использовать сигнал уведомления для свойств для подключения или других не связанных с имуществом сигналов. Я думаю, что есть другой способ сделать это, но я не могу вспомнить.

Ответ 2

Один из способов - использовать классы Qt Model/View (с базой в QAbstractItemModel), но им нужно, чтобы ваш виджет наследовал QAbstractItemView (это виджеты, такие как QTableView и т.д.).
Если вы хотите, чтобы модель Qt модели Qt устанавливала набор виджетов, которые не имеют ничего общего с QAbstractItemView, вы можете использовать QDataWidgetMapper, который отображает отдельный виджет в индексы Qt Model/View. Но в любом случае, как сказал Аарон Дигулла, вы должны написать код котловой плиты...

Ответ 3

Как упоминается в комментариях пользователя, можно использовать класс QDataWidgetMapper. Это довольно простой способ привязать произвольные виджеты к данным, хранящимся в QAbstractItemModel.

Пример на связанной странице показан в нескольких строках кода, как вы можете связать свою модель данных с общими используемыми виджетами ввода:

QDataWidgetMapper *mapper = new QDataWidgetMapper;
mapper->setModel(model);
mapper->addMapping(mySpinBox, 0);
mapper->addMapping(myLineEdit, 1);
mapper->addMapping(myCountryChooser, 2);
mapper->toFirst();