【问题标题】:programmatically check items in a QAbstractItemModel / QTreeView以编程方式检查 QAbstractItemModel / QTreeView 中的项目
【发布时间】:2018-08-30 12:37:59
【问题描述】:

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

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

【问题讨论】:

  • myModel-&gt;checkSelectedItems( myTree-&gt;selectionModel()-&gt;selectedIndexes(), true );之后写myTree-&gt;update();
  • 这似乎并没有解决问题,还尝试使用修改后的索引调用myTree-&gt;update(index)
  • 对不起!在这一刻,我没有更多的想法。我稍后会再次检查。
  • 别担心,值得一试,谢谢提示!
  • myTree-&gt;repaint() 解决了这个问题,但我不确定这是不是正确的方法。

标签: qt model qtreeview qabstractitemmodel


【解决方案1】:

您显示的代码虽然不正确,但大部分都可以正常工作。请修改问题以包括复制案例。但是是的,代码确实有问题。

setData 的合约中发出dataChanged 信号;在setData 之外发出dataChanged 的任何代码都表示模型的实现已损坏。您应该将信号发射移至MyModel::setData。唯一可以发出dataChanged 的地方是代理模型中的槽/函子,但仅当槽/函子连接到sourceModeldataChanged 信号时。

myTree->repaint() 解决了这个问题

在小部件的实现之外调用repaint()update() 几乎总是一个错误,并表明该小部件要么未正确使用,要么未正确实现。在您的情况下,是前者:模型的 setData 已损坏并且不会发出 dataChanged

有关此类测试用例的灵感,请参见例如this answer。简而言之:目标是 100 行或更少,单个文件,#include &lt;QtWidgets&gt; 开头,没有不必要的代码或样板。让它变得甜蜜而简单:)

【讨论】:

    猜你喜欢
    • 2011-11-16
    • 2011-09-29
    • 2016-07-20
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多