Элементы TreeView QML не обновляются при отправке dataChanged

У меня есть 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, то это работает.

2

Решение

В то время как beginResetModel() а также endResetModel() сделает недействительным весь вид, dataChanged() только делает недействительным диапазон, который вы ему даете.

Если вы знаете, какое значение изменилось, вы можете использовать его как

 emit dataChanged(createIndex(row,col),createIndex(row,col));

или когда меняются несколько строк / ячеек, второй параметр — это последний измененный индекс.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]