我有一个像这样的QML TreeView
:
TreeView
{
id: treeview
model: myModel
anchors.fill: parent
alternatingRowColors: false
headerVisible: false
TableViewColumn
{
title: "Name"
role: "name"
delegate: Text
{
text: styleData.value
}
}
但是,当我从C ++中的自定义方法发出dataChanged时,没有更新任何内容:
void MyModel::NameChanged()
{
// beginResetModel(); <=== Works
// endResetModel();
// emit dataChanged(QModelIndex(), QModelIndex()); // Does not work
auto topLeftIndex = createIndex(0, 0, m_root.get());
auto bottomRightIndex = createIndex(rowCount(), columnCount(), m_root.get());
(( emit dataChanged(topLeftIndex, bottomRightIndex); // Does not work.
emit dataChanged(topLeftIndex, topLeftIndex); // Does not work.
}
在QML中,text
绑定到styleData.value
并且我没有在其他地方设置文本。此外,dataChanged未在其他地方重新定义。所以我确信我真的在散发QAbstractItemModel::dataChanged(...)
。
知道我做错了吗?
我的索引方法:
QModelIndex index(int row, int column, const QModelIndex &parentIdx) const
{
if (hasIndex(row, column, parentIdx) == false)
{
return QModelIndex();
}
auto parentItem = m_root.get();
if (parentIdx.isValid() == true)
{
parentItem = static_cast<ModelItem *>(parentIdx.internalPointer());
}
auto childItem = parentItem->GetChild(row);
auto childName = childItem->GetName().toStdString();
if (childItem)
{
auto index = createIndex(row, column, childItem.get());
return index;
}
else
{
return QModelIndex();
}
}
我的父方法:
QModelIndex parent(const QModelIndex &childIndex) const
{
if (childIndex.isValid() == false)
{
return QModelIndex();
}
auto childItem = static_cast<ModelItem*>(childIndex.internalPointer());
auto parentItem = childItem->GetParent();
if (parentItem.expired() == true)
{
return QModelIndex();
}
auto pItem = parentItem.lock();
if (pItem == nullptr)
{
return QModelIndex();
}
auto parentIndex = createIndex(pItem->GetRow(), 0, pItem.get());
return parentIndex;
}
更新:如果我使用QTreeView在C ++中使用我的模型,那么它可以工作。
答案 0 :(得分:0)
虽然beginResetModel()
和endResetModel()
会使整个视图无效,但dataChanged()
只会使您提供的范围无效。
如果你知道改变了什么值,你可以像
一样使用它 emit dataChanged(createIndex(row,col),createIndex(row,col));
或当多行/单元改变时,第二个参数是“最后一个”改变的索引。