自定义SearchItem类 ------ Model-View-Control(MVC)架构(5)

在Qt工程中,为了适配特定的数据结构,本文介绍了如何创建一个名为SearchItem的自定义类,用于封装从服务器搜索到的联系人信息,包括账号、头像等。SearchItem类实现了paint函数和sizeHint函数,并通过Q_DECLARE_METATYPE宏使其融入Qt元对象系统,以便与QVariant一起使用。此外,类还包括一个无参数的构造函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在上一篇博客的工程里用到的数据条目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);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值