Можно ли создать сигнал, когда флажок QTreeWidgetItem установлен?

StackOverflow https://stackoverflow.com//questions/9686648

Вопрос

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

Решение

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

Другие советы

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

Подключиться к сигналу GenaCodicetacode дерева.При обращении с сигналом просто проверьте генеракодицетагкод.

Лучшее решение, которое мы нашли, было на наличие 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 действительно, это заставляет меня подумать о том, чтобы всом вклад личности сигнала на точке напрямую :)

PS: Установка Qt :: itemisuserCheckable не нужен, этот флаг по умолчанию по умолчанию для всех QtreewidetTems.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top