以编程方式检查QAbstractItemModel / QTreeView中的项目

时间:2018-08-30 12:38:00

标签: qt model qtreeview qabstractitemmodel

我正在尝试使用选择(QModelIndexList)来检查QTreeView的所有选定项。

我在索引上将setDataQt::CheckStateRole一起使用,并且数据似乎已更新。 我正在发出dataChanged信号,但是树没有重绘(带有和不带有作为参数的角色)。 这是选择模型的问题吗?

如果我beginResetModel可以工作,但是我的树倒塌了,这会破坏交易。

我如何设法重新粉刷我的物品?

这是我在模型中添加的方法

void MyModel::checkSelectedItems( const QModelIndexList &checkedIndexes, bool check )
{
    QVector<int> roles = QVector<int>() << Qt::CheckStateRole;
  for ( const QModelIndex &index : checkedIndexes)
  {
      setData(index, check ? Qt::Checked : Qt::Unchecked, Qt::CheckStateRole);
      emit dataChanged(index, index); //), roles);
  }
}

及其调用:

myModel->checkSelectedItems( myTree->selectionModel()->selectedIndexes(), true );

通话后,选择为灰色(不再是蓝色),但仍为“已选择”。单击任意位置刷新树,并正确显示选中的项目。

1 个答案:

答案 0 :(得分:0)

发出setData信号是dataChanged的工作,而不是您的!您显示的代码是正确的,可以很容易地证明它运行正常。请修改问题以包括复制案。有关此类测试用例的外观的启发,请参见例如this answer。简而言之:目标是100行或更少,单个文件,#include <QtWidgets>开头,没有不必要的代码或样板。让它变得甜美而简单:)