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();