Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 向模型添加新数据后,QML TreeView在运行时未更新_C++_Qt_Qml_Qtquick2_Qtquickcontrols - Fatal编程技术网

C++ 向模型添加新数据后,QML TreeView在运行时未更新

C++ 向模型添加新数据后,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

我有一个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.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
信号。尝试将该信号连接到一个虚拟插槽,以验证是否发出了该信号。@skypjack
treeviewmodel=treeviewmodel
不起作用,并且
dataChanged()
需要QModelIndex作为参数,但不确定如何实现该信号。TreeView刚刚中断,Qt不关心它。它不会对endInsertRows、EndRemoveTows和伴随的信号做出反应。它也不会对layoutChanged之类的信号做出反应……我是通过执行
qmlRegisterType(“treeModel”,1,0,“MyTreeModel”)来注册qml类型的将加载视图的初始状态,但不会刷新。你的方法行得通,谢谢。但是,当尝试在
树视图
上选择项目时没有响应,您以前是否遇到过此问题?很奇怪,如果我单击
树视图
中的一行,该行不会被选中。我想是这个错误:。顺便说一下,你发布的链接断了。谢谢你的帮助!(固定评论)对不起!我没有意识到main.cpp中的那行代码。是的,这就是问题所在。干得好:)关于TreeViews,我不记得他们有什么问题。Qt是TreeView的一个很好的例子。也许这有助于您了解该示例中是否存在相同的问题。我确实存在与该示例相同的问题,我将联系Qt以获得支持。谢谢