لغز: في كيو تي، لماذا editorEvent أن يطلق عليه، ولكن ليس createEditor؟

StackOverflow https://stackoverflow.com/questions/828819

  •  06-07-2019
  •  | 
  •  

سؤال

وأنا إن شاء subclasses ترث QAbstractItemDelegate. هذا هو قانون بلدي. اقتراحات هي موضع ترحيب:

QWidget *ParmDelegate::createWidget(Parm *p, const QModelIndex &index) const {
    QWidget *w;
    if (index.column() == 0) {
        w = new QLabel(p->getName().c_str());
    } else {
        if (p->isSection())
            return NULL;
        w = p->createControl();
    }
    return w;
}

QWidget *ParmDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const {
    cout << "createEditor called" << endl;
    Parm    *p = reinterpret_cast<Parm*>(index.internalPointer());
    QWidget *retval = createWidget(p, index);
    retval->setFocusPolicy(Qt::StrongFocus);
    retval->setParent(parent);
    return retval;
}

void ParmDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const {
    QRect rect(option.rect);
    editor->setGeometry(QRect(QPoint(0,0), rect.size()));
}

void ParmDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const {
    Parm    *p = reinterpret_cast<Parm*>(index.internalPointer());
    scoped_ptr<QWidget> w(createWidget(p, index));
    if (!w)
        return;
    QRect rect(option.rect);
    w->setGeometry(QRect(QPoint(0,0), rect.size()));
    w->render(painter, rect.topLeft());
}

QSize ParmDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const {
    Parm    *p = reinterpret_cast<Parm*>(index.internalPointer());
    scoped_ptr<QWidget> w(createWidget(p, index));
    if (!w)
        return QSize(0,0);
    return w->sizeHint();
}

bool ParmDelegate::editorEvent(QEvent * event, QAbstractItemModel * model, const QStyleOptionViewItem & option, const QModelIndex & index ) {
    cout << "editorEvent called" << endl;
    return false;
}

وعندما يتم تشغيل هذا، أرى فقط أن editorEvent يحصل على استدعاء مرتين لكل حدث تحرير - لا createEditor

هل كانت مفيدة؟

المحلول

وثائق من AbstractItemDelegate كيو تي في:

<اقتباس فقرة>   

لتوفير التحرير مخصصة، وهناك نوعان من الأساليب التي يمكن استخدامها. النهج الأول هو خلق القطعة محرر وعرضه مباشرة على الجزء العلوي من هذا البند. للقيام بذلك يجب reimplement createEditor () لتوفير القطعة محرر، setEditorData () لتجميع محرر مع البيانات من نموذج، وsetModelData () بحيث يمكن للمفوض تحديث النموذج مع البيانات من المحرر.

     

وأما النهج الثاني هو التعامل مع أحداث المستخدم مباشرة من قبل reimplementing editorEvent ().

ويبدو أن هذا القول إن كنت في عداد المفقودين شيء لتحريك النهج الأول. تخميني هو أن وظيفة data() النموذج الخاص بك لا تعود القيمة الصحيحة للخيار Qt::EditRole.

نصائح أخرى

وأنا نفذت TableView التي كنت قد inhertied من QItemDelegate. ثم كان لي مشكلة مماثلة. I تعقب عليه أن لا يدعو "العودة QItemDelegate :: editorEvent (الحدث، والنموذج، والخيار، ومؤشر)؛" في طريقة editorEvent (...).

ويمكنك أن تجرب هذا. ربما يساعد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top