QML TreeView не обновляется во время выполнения после добавления новых данных в модель

У меня есть QML TreeView который получает данные через QStandardItemModel, Когда приложение работает, я нажимаю кнопку, которая добавляет новую запись. Я знаю, что данные меняются, но QML TreeView не обновляется. Я также пытался beginResetModel() а также endResetModel(), Данные правильно отображаются в TreeView после загрузки приложения, но TreeView не изменяется при изменении данных в модели.

treeviewmodel.cpp

#include <QDebug>
#include <QStandardItemModel>
#include "treeviewmodel.h"
TreeViewModel::TreeViewModel(QObject *parent) :
QStandardItemModel(parent)
{
m_roleNameMapping[TreeViewModel_Role_Name] = "name_role";

QStandardItem* entry;
entry = new QStandardItem(QString("my_entry"));
entry->setData("abc", TreeViewModel_Role_Name);

auto childEntry = new QStandardItem( "my_child_entry" );
childEntry->setData( "def",TreeViewModel_Role_Name);
entry->appendRow(childEntry);
appendRow( entry );

}
TreeViewModel& TreeViewModel::Instance()
{
static TreeViewModel instance; //Guaranteed to be destroyed
return instance;
}
void TreeViewModel::addEntry()
{
qDebug () << "Adding entry...";

QStandardItem* entry;
entry = new QStandardItem(QString("my_entry"));
entry->setData("Second Entry", TreeViewModel_Role_Name);
auto childEntry = new QStandardItem( "my_child_entry" );
childEntry->setData( "Second Entry Child",TreeViewModel_Role_Name);
entry->appendRow(childEntry);
appendRow( entry );
qDebug () << rowCount(); //Increases everytime I call the function
//Data is being added
}
QHash<int, QByteArray> TreeViewModel::roleNames() const
{
return m_roleNameMapping;
}

main.qml

import treeModel 1.0
...
MyTreeModel {
id: theModel
}

//Left Tree View
Rectangle {
id: leftView
Layout.minimumWidth: 50
width: 200
//Layout.fillWidth: true
color: "white"TreeView {
id: treeView
anchors.fill: parent
model: theModel
TableViewColumn {
role: "name_role"title: "Name"}
TableViewColumn {
role: "description_role"title: "Description"}
}
}

ToolButton {
iconSource: "lock.png"onClicked: {
treeviewmodel.addEntry()
}
}

main.cpp

QQmlContext* treeViewModelCtx = engine.rootContext();
treeViewModelCtx->setContextProperty("treeviewmodel", &TreeViewModel::Instance());

//Register types
qmlRegisterType<TreeViewModel>("treeModel", 1, 0, "MyTreeModel" );

1

Решение

Надеюсь, этот пример поможет. К сожалению, у меня нет всего вашего кода, чтобы увидеть, в чем проблема.

Может быть, ключи data а также roleNames методы.

В этом примере у нас также есть кнопка с именем addButton добавлять новые предметы.

main.cpp

#include "animalmodel.h"
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <qqmlcontext.h>
#include <qqml.h>

int main(int argc, char ** argv)
{
QGuiApplication app(argc, argv);

AnimalModel model;
model.addAnimal("Wolf", "Medium");
model.addAnimal("Polar bear", "Large");
model.addAnimal("Quoll", "Small");

QQmlApplicationEngine engine;

QQmlContext *ctxt = engine.rootContext();
ctxt->setContextProperty("myModel", &model);

engine.load(QUrl(QStringLiteral("qrc:/view.qml")));

return app.exec();
}

animalmodel.h

#ifndef ANIMALMODEL_H
#define ANIMALMODEL_H

#include <QStandardItemModel>

class AnimalModel : public QStandardItemModel
{
Q_OBJECT
public:
enum AnimalRoles {
TypeRole = Qt::UserRole + 1,
SizeRole
};

AnimalModel(QObject *parent = 0);

Q_INVOKABLE void addAnimal(const QString &type, const QString &size);

QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const;

protected:
QHash<int, QByteArray> roleNames() const;
};

#endif // ANIMALMODEL_H

animalmodel.cpp

#include "animalmodel.h"
AnimalModel::AnimalModel(QObject *parent)
: QStandardItemModel(parent)
{

}

void AnimalModel::addAnimal(const QString &type, const QString &size)
{
QStandardItem* entry = new QStandardItem();
entry->setData(type, TypeRole);

auto childEntry = new QStandardItem();
childEntry->setData(size, SizeRole);
entry->appendRow(childEntry);

appendRow( entry );
}

QVariant AnimalModel::data(const QModelIndex & index, int role) const {
QStandardItem *myitem = itemFromIndex(index);

if (role == TypeRole)
return myitem->data(TypeRole);
else if (role == SizeRole) {
if (myitem->child(0) != 0)
{
return myitem->child(0)->data(SizeRole);
}
}

return QVariant();
}

QHash<int, QByteArray> AnimalModel::roleNames() const {
QHash<int, QByteArray> roles;
roles[TypeRole] = "type";
roles[SizeRole] = "size";
return roles;
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]