QDataWidgetMapper - это немного другое. Это способ отображения одного элемента из модели (например, QStandardItemModel) с использованием пользовательских элементов управления. Вы можете прочитать больше об этом здесь , с сопровождающими снимками и примером того, как реализовать один.
Хотя это, конечно, круто, я не думаю, что это то, что вы хотите здесь. Главным образом потому, что вы указали, что хотите просматривать свои элементы в виде списка. Тем не менее, вы можете отобразить все ваши элементы в простом списке, дважды щелкнув по которому откроется диалоговое окно с использованием QDataWidgetMapper. В этом случае все, что вам нужно сделать с QListView / QListWidget, это реализовать событие двойного щелчка.
Тем не менее, мне лично не нравится дополнительное бремя дополнительного окна для пользователя. Я предпочитаю использовать всплывающие окна экономно. Но если вам нравится такой подход, тогда продолжайте. Этот является еще одним примером довольно симпатичного QDataWidgetMapper.
Мой предпочтительный подход по-прежнему заключается в использовании QTableView и предоставлении делегатов для столбцов, которые требуют специального редактирования. Здесь - это отличный обзор всех вещей Модель / Вид. Поэтому, если вы решите использовать QListView или QTableView, это послужит вам хорошим началом. В нем также говорится о том, как вы можете создавать делегатов для редактирования полей по своему усмотрению.
Итак, как вы создаете пользовательский делегат? По сути, вы просто наследуете от QItemDelegate. В приведенной выше ссылке есть несколько примеров, но я выделю несколько важных моментов.
QWidget *ComboBoxDelegate::createEditor(QWidget *parent,
const QStyleOptionViewItem &/* option */,
const QModelIndex &index) const
{
QComboBox *editor = new QComboBox (parent);
// Add items to the combobox here.
// You can use the QModelIndex passed above to access the model
// Add find out what country was selected, and therefore what cities
// need to be listed in the combobox
return editor;
}
void ComboBoxDelegate::setEditorData(QWidget *editor,
const QModelIndex &index) const
{
int value = index.model()->data(index, Qt::EditRole).toInt();
QComboBox *comboBox= static_cast<QComboBox *>(editor);
int _SelectedItem = // Figure out which is the currently selected index;
comboBox->setCurrentIndex(_SelectedItem);
}
void ComboBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
const QModelIndex &index) const
{
QComboBox *comboBox= static_cast<QComboBox *>(editor);
comboBox->interpretText();
int value = comboBox->currentIndex();
// Translate the current index to whatever you actually want to
// set in your model.
model->setData(index, value, Qt::EditRole);
}
Заполните пробелы, которые я оставил в моем примере, и у вас есть ваш делегат.
Теперь, как использовать это в вашем QTableView:
Вы можете установить делегата для определенного столбца вашей таблицы следующим образом:
setItemDelegateForColumn(_ColumnIndex, new ComboBoxDelegate(_YourTableModel));
И, если вы хотите запретить редактирование определенных столбцов:
_YourTableModel->setColumnEditable(_ColumnIndex, false);
Как только вы настроите свою модель, все остальное должно позаботиться о себе.
Надеюсь, это поможет.