Можно ли создать сигнал для включения переключателя QTreeWidgetItem?

Я создал флажок, который также содержит QTreeWidgetItem, используя следующий код.

//Populate list
QTreeWidgetItem *program = createCheckedTreeItem(QString::fromStdString(itr->first), true);
treePrograms->addTopLevelItem(program);

QTreeWidgetItem* ConfigDialog::createCheckedTreeItem(QString name,bool checkBoxState)
{
  QTreeWidgetItem *item = new QTreeWidgetItem(QStringList(name));
  item->setFlags(item->flags()|Qt::ItemIsUserCheckable);
  if (checkBoxState)
  {
    item->setCheckState(0,Qt::Unchecked);
  }
  else
  {
    item->setCheckState(0,Qt::Checked);
  }
  return item;
}

Мне нужен способ подключения сигнала и слота, когда изменяется состояние этого флажка. В настоящее время я реализовал это ниже, но, к сожалению, не работает. Может кто-нибудь объяснить, что я делаю неправильно, и что мне нужно сделать, чтобы связать его?

connect(program, SIGNAL(toggled(bool)), this, SLOT(programChecked(bool)));

Ответ 1

Ваш QTreeWidgetItem напрямую связан с вашими данными модели, поэтому вам необходимо подключиться к вашему сигналу модели QTreeWidget QAbstractItemModel::dataChanged, чтобы получить уведомление об этом изменении.

Ответ 2

Вам нужно захватить сигнал itemChanged ( QTreeWidgetItem * item, int column ), исходящий из QTreeWidget.

Ответ 3

Подключитесь к сигналу itemClicked(QTreeWidgetItem* item, int column) дерева. При обработке сигнала просто подтвердите item->checkState(column).

Ответ 4

Лучшее решение, которое мы нашли, - это переопределить setData в подклассе элемента:

void MyItem::setData(int column, int role, const QVariant& value)
{
    const bool isCheckChange = column == 0
        && role == Qt::CheckStateRole
        && data(column, role).isValid() // Don't "change" during initialization
        && checkState(0) != value;
    QTreeWidgetItem::setData(column, role, value);
    if (isCheckChange) {
        MyTree *tree = static_cast<MyTree *>(treeWidget);
        emit tree->itemCheckStateChanged(this, checkState(0) == Qt::Checked);
    }
}

На самом деле было бы удобно иметь это в Qt, и это заставляет меня задуматься о том, как напрямую подать сигнал itemCheckStateChanged:)

PS: установка Qt:: ItemIsUserCheckable не требуется, этот флаг включен по умолчанию для всех QTreeWidgetItems.