программно проверять элементы в QAbstractItemModel / QTreeView - PullRequest
0 голосов
/ 30 августа 2018

Я пытаюсь использовать выделение (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 Ответ

0 голосов
/ 30 августа 2018

Работа setData - излучать сигнал dataChanged, а не ваш! Код, который вы показываете, верен, и легко показать, что он работает нормально. Пожалуйста, измените вопрос, чтобы включить случай воспроизведения. Для вдохновения о том, как может выглядеть такой тестовый пример, см., Например, этот ответ . В двух словах: нацеливайтесь на 100 строк или меньше, один файл, #include <QtWidgets> в начале, без лишних кодов и шаблонов. Сделай это сладким и простым:)

...