以编程方式检查QAbstractItemModel / QTreeView中的项目
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了以编程方式检查QAbstractItemModel / QTreeView中的项目相关的知识,希望对你有一定的参考价值。
我正在尝试使用选择(QModelIndexList)来检查QTreeView的所有选定项目。
我在索引上使用setData
和Qt::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中的项目的主要内容,如果未能解决你的问题,请参考以下文章