//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);
}
测试运行,效果如下:
完整代码链接:点击跳转