我想通过 模型 和 委托(delegate) 插入 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。
问题是从不调用委托(delegate)方法,因此没有插入我的自定义小部件(我只看到
FeatureModel
的字符串)。但是,如果我使用
QTableView
而不是 QComboBox
,它会正常工作。有人知道错误在哪里吗?
我是否遗漏了 QT 模型/ 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
中的 View 允许编辑:
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
时,可以更改当前项目的文本,不会调用委托(delegate)方法进行编辑。您必须选择一项,然后才能对其进行编辑。无论如何,我发现将
QComboBox
用于可编辑项目是违反直觉的。您确定此任务需要 QComboBox
吗?希望能帮助到你
关于c++ - QComboBox 不调用委托(delegate)方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13430668/