모델/뷰/컨트롤러 패러다임을 따랐습니다. 나는 모델과 뷰가 옳다는 것을 확신하지만, 나는 나의 대의원에게 잘못된 것을하고 있다고 생각한다. 모든 것은 "작동"합니다. 단, 컨트롤을 처음 클릭하는 것만 제외하면 "컨트롤이 켜지 며"두 번째 컨트롤과 상호 작용합니다. 이것은 대표자가 일반적으로 구현되는 방식입니까? 내 구현은 scoped_ptr에 의해 감추어 진 많은 구조와 파괴를 필요로하므로 그 어떤 팁도 도움이된다.Qt에서 대리자를 어떻게 올바르게 구현합니까?
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);
}
아마도 Model-View-Controller를 의미 할 것입니다. 모델/뷰/위임 패러다임과 같은 것은 없다. – shoosh
Fixed .......... –