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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了以编程方式检查QAbstractItemModel / QTreeView中的项目相关的知识,希望对你有一定的参考价值。

我正在尝试使用选择(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 );

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

答案

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

以上是关于以编程方式检查QAbstractItemModel / QTreeView中的项目的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式检查方法是不是公开[重复]

如何使用 c# 检查 OpenOffice 是不是以编程方式安装

以编程方式检查 SD 卡是不是可用

检查 Stackable 文件系统是不是以编程方式安装

如何以编程方式检查大写锁定是不是打开

以编程方式检查 Windows 7 是不是已激活