Я хочу настроить QComboBox
вставив QWidgets
(вместо строк) через модель и делегат:
QComboBox *cb = new QComboBox(this);
FeatureModel *featureModel = new FeatureModel(cb);
cb->setModel(featureModel);
ComboBoxItemDelegate *comboBoxItemDelegate = new ComboBoxItemDelegate(cb);
cb->setItemDelegate(comboBoxItemDelegate);
FeatureModel наследует от QAbstractListModel, а ComboBoxItemDelegate наследует от QStyledItemDelegate.
Проблема в том, что методы делегатов никогда не вызываются, и поэтому мой пользовательский виджет не вставляется (я вижу только строки FeatureModel
).
Тем не менее, если я использую QTableView
вместо QComboBox
работает как надо.
Кто-нибудь знает, где лежит ошибка?
Я пропускаю какой-то важный аспект QT Model / View концепция?
РЕДАКТИРОВАТЬ:
Вот мой делегат.
За исключением конструктора (конечно), ни один из следующих методов не вызывается (без вывода на консоль).
ComboBoxItemDelegate::ComboBoxItemDelegate(QObject *parent) :
QStyledItemDelegate(parent)
{
qDebug() << "Constructor ComboBoxItemDelegate";
}
ComboBoxItemDelegate::~ComboBoxItemDelegate()
{
}
QWidget* ComboBoxItemDelegate::createEditor( QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index ) const
{
qDebug() << "createEditor"; // never called
QWidget *widget = new QWidget(parent);
Ui::ComboBoxItem cbi;
cbi.setupUi(widget);
cbi.label->setText(index.data().toString());
widget->show();
return widget;
}void ComboBoxItemDelegate::setEditorData ( QWidget *editor, const QModelIndex &index ) const
{
qDebug() << "setEditorData"; // never called
}void ComboBoxItemDelegate::setModelData ( QWidget *editor, QAbstractItemModel *model, const QModelIndex &index ) const
{
qDebug() << "setModelData"; // never called
}
Я думаю, что нашел проблему.
Во-первых, убедитесь, что вид в QComboBox
позволяет редактировать:
cb->view()->setEditTriggers(QAbstractItemView::AllEditTriggers);
Я не уверен, что это хорошая практика, но это был единственный способ заставить это работать. Значение по умолчанию для editTriggers
является QAbstractItemView::NoEditTriggers
Во-вторых, убедитесь, что ваша модель позволяет редактировать:
Qt::ItemFlags MyModel::flags(const QModelIndex &index) const
{
if (!index.isValid())
return Qt::ItemIsEnabled;
return QAbstractItemModel::flags(index) | Qt::ItemIsEditable;
}
bool MyModel::setData(const QModelIndex &index,
const QVariant &value, int role)
{
if (index.isValid() && role == Qt::EditRole) {
// Modify data..
emit dataChanged(index, index);
return true;
}
return false;
}
Хотя есть проблема. Первый раз, когда вы видите ComboBox
Вы можете изменить текущий текст элемента, и он не вызовет методы делегата для редактирования. Вы должны выбрать один элемент, и тогда вы сможете редактировать его.
Во всяком случае, я считаю, что с помощью QComboBox
для редактируемых элементов нелогично. Вы уверены, что вам нужен QComboBox
для этой задачи?
Надеюсь, поможет
Других решений пока нет …