自定义委托(代理)SearchDelegate ------ Model-View-Control(MVC)架构(6)

现在,模型、视图、数据条目都有了,最后再添加委托(Delegate,也叫代理)。

代理主要完成数据条目的呈现、渲染。所以其中两个最重要的函数就是paint和sizeHint,paint函数负责数据条目的具体呈现,在哪里画个图标,或者在哪里写几个字,都在这里完成。sizeHint用以通知Qt系统当前的数据条目的尺寸。

这2个函数里用到的数据,都来自于自定义的数据条目SearchItem,这个可以参见上一篇博客。

具体代码如下:

search_delegate.h

#ifndef SEARCH_DELEGATE_H
#define SEARCH_DELEGATE_H

#include <QStyledItemDelegate>

class SearchDelegate : public QStyledItemDelegate
{
    Q_OBJECT
public:
    explicit SearchDelegate(QObject *parent = 0);

    void paint(QPainter *painter,
               const QStyleOptionViewItem &option,
               const QModelIndex &index) const;

    QSize sizeHint(const QStyleOptionViewItem &option,
                   const QModelIndex &index) const;

};

#endif // SEARCH_DELEGATE_H

search_delegate.cpp

#include "search_delegate.h"
#include "search_item.h"
#include <QPainter>
#include <QBrush>

#include <QDebug>

SearchDelegate::SearchDelegate(QObject *parent) :
    QStyledItemDelegate(parent)
{
}

void SearchDelegate::paint(QPainter *painter,
                           const QStyleOptionViewItem &option,
                           const QModelIndex &index) const
{
    qDebug()<<"paint";

    //如果是自定义的item,则用以下方法绘制
    if(index.data().canConvert<SearchItem*>())
    {
        QStyledItemDelegate::paint(painter,
                                   option,
                                   index);
        painter->save();
        SearchItem *item=qvariant_cast<SearchItem*>(index.data());
        qDebug()<<item->nickname;
        item->paintSelf(painter,
                        option.rect);
        painter->restore();
    }
    //否则,用默认方法绘制(实际上,我们全部是自定义的item,但这个也必须要写上)
    else
    {
        QStyledItemDelegate::paint(painter,
                                   option,
                                   index);
    }
}

QSize SearchDelegate::sizeHint(const QStyleOptionViewItem &option,
                               const QModelIndex &index) const
{
    if(index.data().canConvert<SearchItem*>())
    {
        SearchItem *item=qvariant_cast<SearchItem*>(index.data());
        return item->sizeHint();
    }
    else
    {
        return QStyledItemDelegate::sizeHint(option,
                                             index);
    }
}

至此,模型、视图(数据条目)、委托全部完成。编译、运行测试,虽然没报错,但是发现,视图里空空如也,啥也没用:


为什么会是这样?问题留待下一篇博客解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值