При использовании пользовательской модели данных, если текущая позиция просмотра превышает 100, после добавления данных она переместится на сотую позицию;
ListModel:
header:
#include <QAbstractListModel>
class ChatListItemModal: public QAbstractListModel {
Q_OBJECT
public:
explicit ChatListItemModal(QObject *parent = 0);
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
void addChatItems(QVector<QString> items);
private:
QVector<QString> chatItem;
};
cpp:
#include "chatlistitemmodel.h"
ChatListItemModal::ChatListItemModal(QObject *parent): QAbstractListModel(parent)
{
}
int ChatListItemModal::rowCount(const QModelIndex &parent) const
{
return (parent.isValid() && parent.column() != 0) ? 0 : this->chatItem.size();
}
QVariant ChatListItemModal::data(const QModelIndex &index, int role) const {
if (index.isValid() && index.row() < chatItem.size() && index.row() >= 0 && role == Qt::DisplayRole)
return QVariant::fromValue<QString>(chatItem.at(index.row()));
return QVariant();
}
void ChatListItemModal::addChatItems(QVector<QString> items)
{
if (items.isEmpty())
return;
beginInsertRows(QModelIndex(),
chatItem.size(),
chatItem.size() + items.size() - 1
);
chatItem.append(items);
endInsertRows();
}
QScrollView:
header :
#include "chatlistitemdelegate.h"
#include "chatlistitemmodel.h"
#include <QListView>
#include <QVector>
class ChatListScrollView: public QListView
{
Q_OBJECT
public:
ChatListScrollView(QWidget *parent = nullptr);
void render();
void onAddChat(const int count = 0);
private:
ChatListItemModal *listModal;
ChatListItemDelegate *listItemDelegate;
};
cpp:
#include "chatlistscrollview.h"
ChatListScrollView::ChatListScrollView(QWidget *parent): QListView(parent)
{
render();
}
void ChatListScrollView::render()
{
setFrameShape(QListView::NoFrame);
setResizeMode(QListView::ResizeMode::Fixed);
setLayoutMode(QListView::LayoutMode::Batched);
setFlow(QListView::TopToBottom);
setMovement(QListView::Static);
setViewMode(QListView::ListMode);
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents);
setAutoScroll(true);
setUniformItemSizes(true);
viewport()->setAutoFillBackground(false);
listItemDelegate = new ChatListItemDelegate(this);
setItemDelegate(listItemDelegate);
listModal = new ChatListItemModal(this);
setModel(listModal);
scrollToBottom();
}
// parent component trigger
void ChatListScrollView::onAddChat(const int count)
{
int dataCount = listModal->rowCount();
QVector<QString> list;
for (int i = 0; i < count; ++i)
{
QString title = QStringLiteral("hello %1").arg(i + dataCount);
list.push_back(title);
}
listModal->addChatItems(list);
}
Такое ощущение, что никакой другой метод не вызывается, кажется, что вывод в data () сначала получает данные строки 100, а затем получает остальные данные.
Спасибо за любые предложения!