Можно ли создать сигнал, когда установлен флажок QTreeWidgetItem? - PullRequest
11 голосов
/ 13 марта 2012

Я создал флажок, который также является 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)));

Ответы [ 4 ]

6 голосов
/ 13 марта 2012

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

4 голосов
/ 13 марта 2012

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

3 голосов
/ 04 сентября 2015

Лучшим решением, которое мы нашли, было переопределение 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.

3 голосов
/ 02 апреля 2014

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

...