Для тех, у кого возникла та же проблема, я нашел решение, простое в реализации, но довольно странное ... Идея состоит в том, чтобы использовать пользовательский 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
.