Qml 列表视图在重置模型时保留视图
Qml Listview keep views when resetting model
我有一个qml列表视图,其中包含来自c ++的模型。数据从另一个线程生成,并在 C++ 代码中更新为模型。之后,我使用BeginResetModel()
在 qml 中更新列表视图。除了 qml 中的视图之外,一切都可以正常工作,但我希望列表视图保留当前视图而不更改视图。
女工程师:
列表视图元素.cpp
ListViewElement::ListViewElement(int id,QString attr):m_id(id),m_attr(attr)
{
}
int ListViewElement::getId()
{
return m_id;
}
QString ListViewElement::getAttr()
{
return m_attr;
}
列表视图模型.cpp
ListViewModel::ListViewModel(QObject *parent): QAbstractListModel(parent)
, m_items(new QList<ListViewElement*>()){
}
QHash<int,QByteArray> ListViewModel::roleNames() const
{
qDebug() << Q_FUNC_INFO;
QHash<int,QByteArray> roles;
roles[ListViewEnum::ID] = "id";
roles[ListViewEnum::ATTR] = "attr";
return roles;
}
QVariant ListViewModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid() || index.row() > m_items->size()-1)
return QVariant();
ListViewElement *dobj = m_items->at(index.row());
if (!dobj)
return QVariant();
switch (role) {
case ListViewEnum::ID:
return QVariant::fromValue(dobj->getId());
case ListViewEnum::ATTR:
return QVariant::fromValue(dobj->getAttr());
default:
return QVariant();
}
}
int ListViewModel::rowCount(const QModelIndex &parent) const
{
Q_UNUSED(parent)
return m_items? m_items->size(): 0;
}
void ListViewModel::generateData()
{
ListViewElement *ele = new ListViewElement(1,"attribute");
m_items->append(ele);
beginResetModel();
endResetModel();
}
主.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include "listviewmodel.h"
#include <QQmlContext>
#include <QTimer>
int main(int argc, char *argv[])
{
ListViewModel model;
QTimer *timer = new QTimer();
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.rootContext()->setContextProperty("listViewModel",&model);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
QObject::connect(timer,SIGNAL(timeout()),&model,SLOT(generateData()));
timer->start(1000);
return app.exec();
}
主.qml
import QtQuick 2.5
import QtQuick.Window 2.2
Window {
id: appMain
visible: true
width: 640
height: 480
title: qsTr("Hello World")
color: "#FFFF88"
ListView {
id: mainListView
width: parent.width
height: parent.height
spacing: 10
highlight: Rectangle {color: "green";radius: 5; focus: true}
highlightFollowsCurrentItem: true
focus: true
cacheBuffer: 100
model: listViewModel
delegate: Rectangle {
width: parent.width
height: 35
color: "transparent"
Text {
text: "t" + id + "t" + attr
}
MouseArea {
width: parent.width
height: parent.height
onClicked: {
console.log("click item" + index)
mainListView.currentIndex = index
}
}
}
}
Item {
id: scrollBar
width: 12; height: mainListView.height
anchors.left: mainListView.left
opacity: 0.7
property real position: mainListView.visibleArea.yPosition
property real pageSize: mainListView.visibleArea.heightRatio/2
property int orientation: Qt.Vertical
visible: true
Rectangle {
id: background
anchors.fill: parent
radius: scrollBar.orientation == Qt.Vertical ? (width/2 - 1) : (height/2 - 1)
color: "white"
opacity: 1.0
}
Rectangle {
x: scrollBar.orientation == Qt.Vertical ? 1 : (scrollBar.position *(scrollBar.width - 2) + 1)
y: scrollBar.orientation == Qt.Vertical ? (scrollBar.position *(scrollBar.height - 2) + 1) : 1
width: scrollBar.orientation == Qt.Vertical ? (parent.width - 2) : (scrollBar.pageSize * (scrollBar.width - 2))
height: scrollBar.orientation == Qt.Vertical ? (scrollBar.pageSize * (scrollBar.height - 2)) : (parent.height - 2)
radius: scrollBar.orientation == Qt.Vertical ? (width/2 - 1) : (height/2 - 1)
color: "black"
opacity: 0.2
}
}
}
据我所知,我有几个建议,尽管我没有测试它,所以它可能会也可能不会起作用。
- 我看到您只附加数据,那么当您可以一行一行地插入并使用
beginInsertRows() and endInsertRows()
方法时,为什么要重置模型呢? - 如果这没有帮助,您可以在 QML 中连接到模型
modelAboutToBeReset()
信号(为此编写一个处理程序onModelAbouttoBeReset
(并在重置之前保存当前索引,然后在重置模型后,使用处理程序onModelReset
通过调用"positionViewAtIndex(index, mode("方法将列表视图定位在此索引上ListView
附言您必须在调用beginResetModel()
和endResetModel()
之间更改模型
相关文章:
- Qt - QVector 和模型视图 - 从列表视图获取自定义类的最佳方法是什么?
- 如何根据模型设置的视图调整模型?
- Qml 列表视图在重置模型时保留视图
- 为 QML 树视图创建模型
- C++模型视图设计
- 如何从模型/视图中获取QImage POINTER
- 更新模型/视图方案中 QXXXView (QTableView, QTreeView,..) 元素的显示工具提示
- MFC在切换视图时如何关闭无模型对话框
- 从角度转换为正交保持相同的模型和缩放的视图大小
- Qt中数据类(模型)和视图/控制器类之间的数据通信的正确方式是什么
- Qt:从视图中删除模型
- Qt:模型/视图框架上的数据转换
- 根据用户的视图更改更新模型
- 多个模型视图矩阵
- 垂直列表视图中的水平列表视图模型
- 具有两种不同视图的Qt数据模型
- Qt 5.2模型视图模式:如何通知模型对象底层数据结构的变化
- 了解Qt视图模型架构:何时创建以及如何在QAbstractItemModel实现中清除索引
- Qt中刷新视图模型
- 现代OpenGL投影视图模型转换不起作用