Решил сделать через setData по умному.
Все хорошо, но есть одно НО: при выборе нового индекса в комбобоксе, данные в модель не заносятся, пока комбобокс не потеряет фокус.
QWidget *CObjectInspectorTreeDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
Q_UNUSED(option)
if(index.isValid() && fmodel)
{
PropertyTreeNode * propertyNode = index.data(CObjectInspectorTreeModel::TreeNodeRole).value<PropertyTreeNode*>();
if(!propertyNode || propertyNode==fmodel->rootNode() || index.column()==0)
return NULL;
QWidget * editor = NULL;
QVariant indexValue = index.data(Qt::EditRole);
if(!indexValue.isValid())
return NULL;
if(!propertyNode->isExpandable())
{
if(propertyNode->metaProperty().isEnumType())
{
QComboBox * comboBox = new QComboBox;
connect(comboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(commitAndCloseEditor()));
comboBox->setFrame(false);
EnumProperty * enumProp = qobject_cast<EnumProperty*>(propertyNode);
Q_ASSERT(enumProp);
comboBox->addItems(enumProp->enumeratedProperties());
editor = comboBox;
}
else
switch (propertyNode->value().type())
{
case QVariant::Bool:
{
QCheckBox * checkBox = new QCheckBox;
connect(checkBox,SIGNAL(clicked()),this,SLOT(commitAndCloseEditor()));
editor = checkBox;
break;
}
case QVariant::Int:
case QVariant::LongLong:
{
QSpinBox * spinBox = new QSpinBox;
spinBox->setFrame(false);
spinBox->setMinimum(INT_MIN);
spinBox->setMaximum(INT_MAX);
connect(spinBox,SIGNAL(valueChanged(int)),this,SLOT(commitEditor()));
editor = spinBox;
break;
}
....
void CObjectInspectorTreeDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
if(index.isValid())
{
QPropertyEditWidget * propertyEditor = qobject_cast<QPropertyEditWidget*>(editor);
Q_ASSERT(propertyEditor);
PropertyTreeNode * propertyNode = index.data(CObjectInspectorTreeModel::TreeNodeRole).value<PropertyTreeNode*>();
Q_ASSERT(propertyNode);
if(propertyNode->isExpandable())
return;
const QMetaProperty & indexMetaProperty = propertyNode->metaProperty();
if(indexMetaProperty.isFlagType())
{
QCheckBox * checkBox = qobject_cast<QCheckBox*>(propertyEditor->widget());
Q_ASSERT(checkBox);
model->setData(index,checkBox->isChecked());
return;
}
if(indexMetaProperty.isEnumType())
{
QComboBox * comboBox = qobject_cast<QComboBox*>(propertyEditor->widget());
Q_ASSERT(comboBox);
model->setData(index,comboBox->currentIndex());
return;
}
switch (indexMetaProperty.type())
{
case QVariant::Bool:
{
QCheckBox * checkBox = qobject_cast<QCheckBox*>(propertyEditor->widget());
Q_ASSERT(checkBox);
model->setData(index,checkBox->isChecked());
}
break;
case QVariant::Int:
case QVariant::UInt:
case QVariant::LongLong:
case QVariant::ULongLong:
{
QSpinBox * spinBox = qobject_cast<QSpinBox*>(propertyEditor->widget());
Q_ASSERT(spinBox);
model->setData(index,spinBox->value());
}
break;
...
void CObjectInspectorTreeDelegate::commitAndCloseEditor()
{
QWidget * senderWidget = qobject_cast<QWidget*>(sender());
Q_ASSERT(senderWidget);
emit commitData(senderWidget);
emit closeEditor(senderWidget,QAbstractItemDelegate::SubmitModelCache);
}
void CObjectInspectorTreeDelegate::commitEditor()
{
QWidget * senderWidget = qobject_cast<QWidget*>(sender());
Q_ASSERT(senderWidget);
emit commitData(senderWidget);
senderWidget->close();
}
Т.е. мне нужно что бы в реалтайме в модель заносились данные, а не по завершении/закрытии виджета-редактора.
По форуму рылся, решения не нашёл. Вроде получается и работает, но не так как хочется.