I followed the model / view / controller paradigm. I am sure that the model and presentation are correct, but I think that I am doing something wrong in my doing. Everything "works", except for the first pressing the control, the control "just lights up", and the second interacts with it. Is this usually like delegates? My implementation requires a lot of constructions and destructions (hidden scoped_ptr), so any advice on this subject is also useful.
QWidget *ParmDelegate::createWidget(const QModelIndex &index) const { if (!index.isValid()) return NULL; const Parm *p = static_cast<const Parm*>(index.internalPointer()); QWidget *w = p->createControl(); w->setAutoFillBackground(true); w->setBackgroundRole(QPalette::Base); // white background instead of grey return w; } QWidget* ParmDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const { QWidget *retval = createWidget(index); if (dynamic_cast<QComboBox*>(retval)) connect(retval, SIGNAL(activated(int)), this, SLOT(commitAndCloseEditor())); else if (dynamic_cast<QSlider*>(retval)) connect(retval, SIGNAL(sliderReleased()), this, SLOT(commitAndCloseEditor())); else if (dynamic_cast<QAbstractButton*>(retval)) connect(retval, SIGNAL(clicked()), this, SLOT(commitAndCloseEditor())); else connect(retval, SIGNAL(editingFinished()), this, SLOT(commitAndCloseEditor())); retval->setFocusPolicy(Qt::StrongFocus); retval->setParent(parent); return retval; } void ParmDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const { const Parm *p = static_cast<const Parm*>(index.internalPointer()); p->setEditorData(editor); } void ParmDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const { ParmControl::Base* base = dynamic_cast<ParmControl::Base*>(editor); model->setData(index, base->toQVariant()); } void ParmDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const { editor->setGeometry(option.rect); } void ParmDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { scoped_ptr<QWidget> w(createWidget(index)); if (!w) return; const Parm *p = static_cast<const Parm*>(index.internalPointer()); setEditorData(w.get(), index); w->setGeometry(option.rect); w->render(painter, option.rect.topLeft()); } QSize ParmDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const { scoped_ptr<QWidget> w(createWidget(index)); if (!w) return QSize(0,0); return w->sizeHint(); } void ParmDelegate::commitAndCloseEditor() { QWidget *editor = static_cast<QWidget *>(sender()); ParmControl::Base* base = dynamic_cast<ParmControl::Base*>(editor); emit commitData(editor); emit closeEditor(editor, QAbstractItemDelegate::EditNextItem); }
source share