C++ 向模型添加新数据后,QML TreeView在运行时未更新
我有一个QMLC++ 向模型添加新数据后,QML TreeView在运行时未更新,c++,qt,qml,qtquick2,qtquickcontrols,C++,Qt,Qml,Qtquick2,Qtquickcontrols,我有一个QMLTreeView,它通过QStandardItemModel获取数据。当应用程序运行时,我按下一个按钮,添加一个新条目。我知道数据正在更改,但QMLTreeView没有更新。我还尝试了beginResetModel()和endResetModel()。加载应用程序时,数据会正确显示在TreeView中,但在修改模型中的数据时,TreeView不会更改 treeviewmodel.cpp #include <QDebug> #include <QStandardIt
TreeView
,它通过QStandardItemModel
获取数据。当应用程序运行时,我按下一个按钮,添加一个新条目。我知道数据正在更改,但QMLTreeView
没有更新。我还尝试了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.cpp
QQmlContext* treeViewModelCtx = engine.rootContext();
treeViewModelCtx->setContextProperty("treeviewmodel", &TreeViewModel::Instance());
//Register types
qmlRegisterType<TreeViewModel>("treeModel", 1, 0, "MyTreeModel" );
QQmlContext*treeViewModelCtx=engine.rootContext();
treeViewModelCtx->setContextProperty(“treeviewmodel”和&treeviewmodel::Instance());
//寄存器类型
qmlRegisterType(“treeModel”,1,0,“MyTreeModel”);
我希望这个例子能有所帮助。不幸的是,我没有您的全部代码来查看问题所在
可能关键是数据
和角色名称
方法
在本例中,我们还有一个名为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();
}
#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;
}
#包括“animalmodel.h”
#包括
#包括
#包括
#包括
int main(int argc,字符**argv)
{
QGUI应用程序应用程序(argc、argv);
动物模型;
模型动物(“狼”,“中等”);
模型动物(“北极熊”、“大型”);
模型动物(小的);
qqmlaplicationengine;
QQmlContext*ctxt=engine.rootContext();
ctxt->setContextProperty(“myModel”和&model);
engine.load(QUrl(QStringLiteral(“qrc:/view.qml”));
返回app.exec();
}
动物模型.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
\ifndef动物模型
#定义动物模型
#包括
类动物模型:公共QStandardItemModel
{
Q_对象
公众:
枚举动物角色{
TypeRole=Qt::UserRole+1,
锡泽罗
};
动物模型(QObject*parent=0);
Q_可调用的void addAnimal(常量字符串和类型、常量字符串和大小);
QVariant数据(常量QModelIndex&index,int-role=Qt::DisplayRole)常量;
受保护的:
QHash roleNames()常量;
};
#endif//ANIMALMODEL_H
animalmodel.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();
}
#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;
}
#包括“animalmodel.h”
AnimalModel::AnimalModel(QObject*父对象)
:QStandardItemModel(父级)
{
}
void AnimalModel::addAnimal(常量字符串和类型、常量字符串和大小)
{
QStandardItem*entry=新的QStandardItem();
输入->设置数据(类型、类型角色);
auto childEntry=新的QStandardItem();
childEntry->setData(大小、大小);
条目->追加行(子条目);
附录行(条目);
}
QVariant AnimalModel::data(常量QModelIndex&index,int角色)常量{
QStandardItem*myitem=itemFromIndex(索引);
如果(角色==类型角色)
返回myitem->data(类型角色);
else if(角色==SizeRole){
如果(myitem->child(0)!=0)
{
返回myitem->child(0)->数据(SizeRole);
}
}
返回QVariant();
}
QHash AnimalModel::roleNames()常量{
QHash角色;
角色[类型角色]=“类型”;
角色[SizeRole]=“大小”;
返回角色;
}
作为一种临时解决方法,调用addEntry
后,treeviewmodel=treeviewmodel
可能会起作用。我怀疑您必须在addEntry
内发出通知,通知视图必须重新加载数据。它可以发出该信号吗?调用QStandardItemModel::appendRow
应该会发出qabstractemmodel::rowsinsert
信号。尝试将该信号连接到一个虚拟插槽,以验证是否发出了该信号。@skypjacktreeviewmodel=treeviewmodel
不起作用,并且dataChanged()
需要QModelIndex作为参数,但不确定如何实现该信号。TreeView刚刚中断,Qt不关心它。它不会对endInsertRows、EndRemoveTows和伴随的信号做出反应。它也不会对layoutChanged之类的信号做出反应……我是通过执行qmlRegisterType(“treeModel”,1,0,“MyTreeModel”)来注册qml类型的代码>将加载视图的初始状态,但不会刷新。你的方法行得通,谢谢。但是,当尝试在树视图
上选择项目时没有响应,您以前是否遇到过此问题?很奇怪,如果我单击树视图
中的一行,该行不会被选中。我想是这个错误:。顺便说一下,你发布的链接断了。谢谢你的帮助!(固定评论)对不起!我没有意识到main.cpp中的那行代码。是的,这就是问题所在。干得好:)关于TreeViews,我不记得他们有什么问题。Qt是TreeView的一个很好的例子。也许这有助于您了解该示例中是否存在相同的问题。我确实存在与该示例相同的问题,我将联系Qt以获得支持。谢谢