发出dataChanged时,QML TreeView项不会更新

时间:2016-09-14 14:36:42

标签: c++ qt treeview qml qtquickcontrols

我有一个像这样的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 ++中使用我的模型,那么它可以工作。

1 个答案:

答案 0 :(得分:0)

虽然beginResetModel()endResetModel()会使整个视图无效,但dataChanged()只会使您提供的范围无效。

如果你知道改变了什么值,你可以像

一样使用它
 emit dataChanged(createIndex(row,col),createIndex(row,col));

或当多行/单元改变时,第二个参数是“最后一个”改变的索引。