【QT】列表控件之自定义显示

实现功能:

Model/View框架中的Delgate负责单元格的显示。自己定义如何编辑列表listwidget中的项item。
1、定义每一项的显示大小。
2、显示其data:显示姓名、电话号码,插入表示性别data的图像。

窗口截图:

这里写图片描述

代码实现:

1、派生一个QStyledItemDelegate的类对象MyItemDrawer。

#ifndef MYITEMDRAWER_H
#define MYITEMDRAWER_H
#include <QStyledItemDelegate>
#include <QIcon>


class MyItemDrawer : public QStyledItemDelegate
{
public:
    MyItemDrawer(QWidget *parent);
private: //重写两个虚函数 
    virtual void paint(QPainter *painter,const QStyleOptionViewItem &option,const QModelIndex &index)const;   //显示性别图片
    virtual QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const;   //更改item显示的大小
private:
    QPixmap m_male; // 声明表示性别的两个QPixmap类型图片
    QPixmap m_female;

};

#endif // MYITEMDRAWER_H
#include "myitemdrawer.h"
#include <QPainter>

MyItemDrawer::MyItemDrawer(QWidget *parent)
{
    m_male.load("C:/Users/Maggie/Downloads/male.png");  //析构函数中初始化图片
    m_female.load("C:/Users/Maggie/Downloads/female.png");

}
QSize MyItemDrawer::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    QSize size=QStyledItemDelegate::sizeHint(option,index);
    size.setHeight(80); 
    return size;
}
void MyItemDrawer::paint(QPainter* painter,const QStyleOptionViewItem &option,const QModelIndex &index)const
{
    QRect rect=option.rect;
    rect.adjust(2,2,-2,-2); //缩小一圈
    QString name=index.data(Qt::DisplayRole).toString();  //得到item的数据 姓名
    QString phone=index.data(Qt::UserRole+1).toString(); //得到item的数据 电话号码
    bool gender=index.data(Qt::UserRole+1).toBool();//得到item的数据 性别

    if(option.state&QStyle::State_Selected)
    {
        painter->setBrush(QColor(0xCC,0xAA,0xaa));   
        painter->drawRoundedRect(rect,2,2);     //给每个item的背景涂色  
        painter->setBrush(Qt::NoBrush);
    }
if(1)  //显示姓名
{
        QRect dst=rect;
        dst.setLeft(rect.left()+40);
        dst.setBottom(rect.top()+20);
        painter->drawText(dst,Qt::AlignLeft|Qt::AlignVCenter,name);
}
if(1)  //显示电话号码
{
    QRect dst = rect;
    dst.setLeft(rect.left() + 40);
    dst.setTop(rect.top() + 20);
    painter->drawText(dst, Qt::AlignLeft | Qt::AlignVCenter,phone);
}
if(1)  //显示图片
{
        QRect dst=rect;
        dst.setRight(rect.left()+40);
        QRect area(0,0,24,24);
        area.moveCenter(dst.center());
        painter->drawPixmap(area,gender?m_male:m_female);
}
}

2、MainWindow主窗口类中实现AddItem函数:

void MainWindow::AddItem(QString name,QString phone,bool gender)
{
   QListWidgetItem *item=new QListWidgetItem();
   item->setData(Qt::DisplayRole,name);
   item->setData(Qt::UserRole+1,phone);
   item->setData(Qt::UserRole+2,gender);
   ui->listWidget->addItem(item);
}

3、在MainWindow类构造函数中:

    AddItem("zzn","13922233333",false);  //加入多项数据
    AddItem("hw","13833322222",true);

    ui->listWidget->setItemDelegate(new MyItemDrawer(ui->listWidget)); 
    //给listwidget设置delegate,如果不设置自己写的,默认框架里也会有一个delegate。

猜你喜欢

转载自blog.csdn.net/m0_37557014/article/details/73179917