QListView 自定义数据模型(增、删、改以及选中项文字滚动)

//mymodel.cpp
#include "mymodel.h"

MyModel::MyModel(QObject *parent)
    : QAbstractListModel(parent)
{
    timer = new QTimer(this);
    connect(timer, &QTimer::timeout, this, [&]
    {
        if(lastIndex>=0 && lastIndex<list.size())
        {
            MyData data = list.at(lastIndex);
            QFontMetrics fmt(Delegate::mFont);
            int width = fmt.width(data.name);
            if(width > Delegate::itemWidth)
            {
                data.x -= step;

                if(data.x < -width)
                {
                    data.x = Delegate::itemWidth;
                }
            }
            upadteData(lastIndex, data);
        }
    });
    timer->start(100);
}

int MyModel::rowCount(const QModelIndex &parent) const
{
    if (parent.isValid())
        return 0;

    return list.count();
}

QVariant MyModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid())
        return QVariant();

    if(role == Role_Name)
        return list[index.row()].name;
    else if(role == Role_Value)
        return list[index.row()].value;
    else if(role == Role_X)
        return  list[index.row()].x;
    else if(role == Role_Select)
        return list[index.row()].isSelect;
    else if(role == Role_Scroll)
        return list[index.row()].isScroll;
    else if(role == Role_FontSize)
        return list.at(index.row()).fontSize;
    return QVariant();
}

void MyModel::addData(MyData data)
{
    beginInsertRows(QModelIndex(), 0, 1);
    list.push_front(data);
    endInsertRows();
}

void MyModel::upadteData(int index, MyData data)
{
    list.replace(index, data);
    dataChanged(createIndex(index, 0), createIndex(index, 0));
}

void MyModel::deleteData(int index)
{
    if(list.size() && index < list.size())
    {
        beginRemoveRows(QModelIndex(), index, index-1);
        list.removeAt(index);
        endRemoveRows();
    }
}

void MyModel::clearData()
{
    beginResetModel();
    list.clear();
    endResetModel();
}

void MyModel::indexChange(int index)
{
    if(lastIndex != index && index < list.size())
    {
        MyData data;
        if(lastIndex>=0 && lastIndex<list.size())
        {
            data = list.at(lastIndex);
            data.isSelect = false;
            data.x = 0;
            upadteData(lastIndex, data);
        }

        data = list.at(index);
        data.isSelect = true;
        data.x = 0;
        upadteData(index, data);

        lastIndex = index;
    }
}

//delegate.h
#include "delegate.h"

int Delegate::itemWidth = 0;
QFont Delegate::mFont;

Delegate::Delegate(QObject *parent) : QStyledItemDelegate(parent)
{
    itemWidth = 300;
    mFont.setPixelSize(20);
}

void Delegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    if(index.isValid())
    {
        painter->save();

        QString name = index.data(MyModel::Role_Name).toString();
        bool select = index.data(MyModel::Role_Select).toBool();
        int x = index.data(MyModel::Role_X).toInt();
        //int fontSize = index.data(MyModel::Role_FontSize).toInt();

        QRectF rect(option.rect);

        painter->setBrush(QColor("#e3e3e5"));
        painter->setFont(mFont);
        if(select)
        {
            rect.setX(x);
            painter->setPen(QPen(Qt::red));
            painter->drawText(rect, Qt::AlignVCenter, name);
        }
        else
        {
            painter->setPen(QPen(Qt::black));
            painter->drawText(rect, Qt::AlignLeft | Qt::AlignVCenter, name);
        }

        painter->restore();
    }
}

QSize Delegate::sizeHint(const QStyleOptionViewItem &, const QModelIndex &) const
{
    return QSize(300, 40);
}

测试运行,效果如下:
在这里插入图片描述
完整代码链接:点击跳转

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值