Захватывать событие dataChanged в QTreeWidget только для фактического элемента - PullRequest
0 голосов
/ 26 апреля 2020

Я хочу захватить отмеченные / не отмеченные события на QTreeWidget, но я хочу только события от элемента, который "вызвал" изменение. Пример:

t/
  a
  b

Если я отмечу / сниму флажок a, я хочу одно событие для a, а не событие для t или его родителей, и если я установлю / сниму флажок t, Я хочу, чтобы событие было только на t, а не на t и всех его дочерних элементах.

Есть ли способ сделать это?

Я просмотрел документацию по Qt и не нашел пути сделать это, используя dataChanged или itemChanged. Я посмотрел на itemClicked, но он запускается для другого события (просто выбирая строку), а не для событий клавиатуры.

1 Ответ

0 голосов
/ 26 апреля 2020

Для тех, у кого возникла та же проблема, я нашел решение, простое в реализации, но довольно странное ... Идея состоит в том, чтобы использовать пользовательский QTreeWidgetItem и пользовательское событие в setData. Проблема в том, что setData вызывается рекурсивно для детей и родителей элемента, поэтому я использовал охрану, чтобы не вызывать событие:

class CustomTreeWidgetItem : public QTreeWidgetItem {
  static CustomTreeWidgetItem* emitter;
public:

  // Bring constructors:
  using QTreeWidgetItem::QTreeWidgetItem;

public:

  void setData(int column, int role, const QVariant& value) override {
    if (emitter == nullptr) {
      qDebug() << "Role changed: " << text(column) << (checkState(column) == Qt::Checked);
      emitter = this;
    }
    QTreeWidgetItem::setData(column, role, value);
    if (emitter == this) {
      emitter = nullptr;
    }
  }
};

CustomTreeWidgetItem* CustomTreeWidgetItem::emitter = nullptr;

Вместо * 1007 можно генерировать пользовательское событие * строка выше.

Я использую static в коде для простоты, но лучшим решением было бы использование пользовательского QTreeWidget, который хранит охрану и извлекает, используя treeModel() в setData.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...