У меня есть QML TreeView
как это:
TreeView
{
id: treeview
model: myModel
anchors.fill: parent
alternatingRowColors: false
headerVisible: false
TableViewColumn
{
title: "Name"role: "name"delegate: Text
{
text: styleData.value
}
}
Однако когда я генерирую dataChanged из пользовательского метода в C ++, ничего не обновляется:
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;
}
ОБНОВЛЕНИЕ: если я использую свою модель в C ++ с использованием QTreeView, то это работает.
В то время как beginResetModel()
а также endResetModel()
сделает недействительным весь вид, dataChanged()
только делает недействительным диапазон, который вы ему даете.
Если вы знаете, какое значение изменилось, вы можете использовать его как
emit dataChanged(createIndex(row,col),createIndex(row,col));
или когда меняются несколько строк / ячеек, второй параметр — это последний измененный индекс.
Других решений пока нет …