代码之家  ›  专栏  ›  技术社区  ›  Denis Rouzaud

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

  •  0
  • Denis Rouzaud  · 技术社区  · 8 年前

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

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

    1 回复  |  直到 8 年前
        1
  •  -1
  •   Kuba hasn't forgotten Monica    7 年前

    您显示的代码尽管不正确,但基本上工作正常。请将问题修改为包括复制品。但是是的,代码确实有问题。

    Ut在 setData 的合同 dataChanged 数据已更改 是在 设置数据 MyModel::setData . 唯一一个可以发射的地方 数据已更改 在代理模型的槽/函子中,但仅当槽/函子连接到 sourceModel 数据已更改 信号。

    myTree->repaint()解决了问题

    repaint() 或 update() 在小部件的实现之外,几乎总是有一个错误,它指示小部件没有正确使用或没有正确实现。对你来说,是前者:模特 设置数据 是破碎的,不会发出 数据已更改

    关于这样一个测试用例可能是什么样子的灵感,请参见例如。 this answer . 简而言之:目标是100行或更少,单个文件, #include <QtWidgets>

    推荐文章