在上一篇博客的工程里用到的数据条目Item,作为实验,是直接采纳的QTableWidgetItem。由于具体的工程里包含的数据各不相同,直接采纳QTableWidgetItem肯定是不合适的。解决办法有两种选择,一是子类化QTableWidgetItem,二是完全重新建立一个自定义类。此处选择后者,建立一个叫SearchItem的自定义类,专门对从服务器搜索到的联系人资料进行封装。联系人的资料有:账号、头像、出生年份、国家、省份、城市和昵称。
本类除了包括7个变量存储联系人资料外,另外只需实现2个函数,一个是自定义的paint函数,供委托调用;一个是sizeHint函数,返回本Item的尺寸大小。
本类最关键的地方在于:由于是自定义类,要想融入Qt元对象系统(meta-object system),能和QVariant一同使用,必要要使用Q_DECLARE_METATYPE()宏对它进行声明;此外,本类还必须包括一个无参数的构造函数。
以下是具体代码:
search_item.h
#ifndef SEARCH_ITEM_H
#define SEARCH_ITEM_H
#include <QMetaType>
//这里必须要include <QString>,否则报错
#include <QString>
class QPainter;
class QSize;
class QRect;
class SearchItem
{
public:
SearchItem();//默认无参构造函数、不可少
SearchItem(quint32 id=0,
quint8 icon=0,
quint16 year=0,
quint8 nation=0,
quint8 province=0,
quint8 city=0,
QString nickname="");
~SearchItem();//析构函数,不可少
quint32 id;
quint8 icon;
quint16 year;
quint8 nation;
quint8 province;
quint8 city;
QString nickname;
//绘制自身Item的函数,自定义的绘制方法都写在这里,供委托调用
void paintSelf(QPainter *painter,
const QRect &rect);
//返回本Item的大小尺寸,通知Qt的布局系统以便安排合适的显示方式
QSize sizeHint() const;
};
Q_DECLARE_METATYPE(SearchItem*)
#endif // SEARCH_ITEM_H
search_item.cpp
#include "search_item.h"
#include <QPainter>
#include <QRect>
#include <QSize>
//作为自定义的数据类型,要被声明为元数据(METATYPE)类型
//必须有一个无参数的构造函数,以及必须有析构函数
SearchItem::SearchItem()
{}
SearchItem::SearchItem(quint32 id,
quint8 icon,
quint16 year,
quint8 nation,
quint8 province,
quint8 city,
QString nickname)
{
this->id=id;
this->icon=icon;
this->year=year;
this->nation=nation;
this->province=province;
this->city=city;
this->nickname=nickname;
}
SearchItem::~SearchItem()
{}
//绘制自身Item的函数,自定义的绘制方法都写在这里,供委托调用
void SearchItem::paintSelf(QPainter *painter,
const QRect &rect)
{
//绘制头像
painter->drawPixmap(rect.x()+5,
rect.y()+5,
QPixmap(QString(":/heads/images/Heads/%1.png")
.arg(this->icon)));
//绘制昵称
painter->drawText(rect.x()+55,
rect.y()+22,
this->nickname);
}
//返回本Item的大小尺寸,通知Qt的布局系统以便安排合适的显示方式
QSize SearchItem::sizeHint() const
{
return QSize(50,50);
}