• 7804阅读
  • 3回复

QTreeView中使用委托 关于setEditorData的不解 [复制链接]

上一主题 下一主题
离线蠢蠢欲懂
 
只看楼主 倒序阅读 楼主  发表于: 2012-05-09
我自己写的委托继承自 QStyledItemDelegate,需要自己实现的函数有如下几个:

    //basic function for a read-only delegate, you can draw anything with the painter
    void paint ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const;
    QSize sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const;

    //for a editable delegate
    QWidget * createEditor ( QWidget * parent, const QStyleOptionViewItem & option, const QModelIndex & index ) const ;
    void setEditorData ( QWidget * editor, const QModelIndex & index ) const ;
    void setModelData ( QWidget * editor, QAbstractItemModel * model, const QModelIndex & index ) const  ;
    void updateEditorGeometry ( QWidget * editor, const QStyleOptionViewItem & option, const QModelIndex & index ) const ;

这几天,编程思考了一番, 不明白为什么不在创建的时候就给Editor赋值呢?后来我专门试了一下,我把setEditorData函数体的赋值内容移到了createEditor中,运行结果:能显示出赋的值。所以我就很奇怪,为什么setEditorData会出现在这儿呢,Qt设计这个函数是出于什么目的?请大家讨论

另外,还有一个问题:用委托写的控件,怎么检测输入数据的合法性之后再提交,我在委托的控件中设置了 validator,如果输入非法数据,每次我按回车之后,会弹出提示 数据非法,但是委托控件还是消失了,这个时候应该能够返回继续编辑的,大侠们有何感想?

离线xuweistudy
只看该作者 1楼 发表于: 2012-05-09
   这个帖子不错哦,顶一个,有经验的大神分享下,学习中。。。
离线uidab

只看该作者 2楼 发表于: 2012-05-09
setEditorData 和 setModelData 是两个行为相反的函数。仔细想想。
有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
离线passion_wu
只看该作者 3楼 发表于: 2012-05-09
         我测试了一下,当你输入值,按回车时也会调用setEditorData,所以setEditorData不光是在创建editor的时候为其赋值。

        关于第二个问题,我参考了下源代码,可以重写eventFilter函数,这个是我写的测试代码:
bool LineEditDelegate::eventFilter(QObject *object, QEvent *event)
{
    QLineEdit *ledt = qobject_cast<QLineEdit*> (object);
    if (!ledt)
        return false;
    if (event->type() == QEvent::KeyPress)
    {
        switch (static_cast<QKeyEvent *> (event)->key())
        {
        case Qt::Key_Tab:
        case Qt::Key_Backtab:
        case Qt::Key_Enter:
        case Qt::Key_Return:
        {
            QString text = ledt->text();
            int pos = text.size();
            if (ledt->validator()->validate(text, pos)
                    != QValidator::Acceptable)
            {
                qDebug() << "error input";
                return true;
            }
        }
        default:
                        //调用基类的处理函数
            return QStyledItemDelegate::eventFilter(object, event);
        }
    }
    return QStyledItemDelegate::eventFilter(object, event);
}
       这样 在按键的时候不会关闭editor,但是当你点击其它地方(就是失去焦点)的时候editor还是会消失,估计需要判断event->type() == QEvent::FocusOut的情况,如果这样还是不能解决失去焦点关闭editor的问题,那我估计需要重写这个函数:
     bool editorEvent(QEvent *event, QAbstractItemModel *model,
                     const QStyleOptionViewItem &option, const QModelIndex &index);
    怎么重写可以参考源代码。我没有深入研究。
快速回复
限100 字节
 
上一个 下一个