QComboBox не вызывает методы делегата

Я хочу настроить 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
}

4

Решение

Я думаю, что нашел проблему.

Во-первых, убедитесь, что вид в 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 для этой задачи?

Надеюсь, поможет

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]