我有一個通過QStandardItemModel
獲取數據的QML TreeView
。當應用程序正在運行時,我按下一個添加新條目的按鈕。我知道數據正在改變,但QML TreeView
未更新。我也試過beginResetModel()
和endResetModel()
。在加載應用程序時,數據在TreeView
中正確顯示,但在修改模型中的數據時TreeView
不會更改。在將新數據添加到模型後,QML 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");
作爲臨時解決辦法,'treeviewmodel = treev在調用'addEntry'之後的'iewmodel'也許有效。 – skypjack
我懷疑你必須在'addEntry'內發出['dataChanged'](http://doc.qt.io/qt-5/qabstractitemmodel.html#dataChanged)來通知視圖必須重新加載數據。它發揮這種信號的作用嗎? – skypjack
對'QStandardItemModel :: appendRow' *的調用應導致發出'QAbstractItemModel :: rowsInserted'信號。嘗試將該信號連接到一個虛擬插槽以驗證它正在發射。 –