Pergunta

Eu criei uma caixa de seleção, que também é um QTreeWidgetItem utilizando o código abaixo.

//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;
}

Eu preciso de uma maneira de conectar um sinal e slot para quando o estado de que esta caixa de seleção é alterada.A forma atual que implementei isso é baixo, mas, infelizmente, não funciona.Alguém pode me explicar o que eu estou fazendo de errado e o que eu preciso fazer para obtê-lo para se conectar?

connect(program, SIGNAL(toggled(bool)), this, SLOT(programChecked(bool)));
Foi útil?

Solução

O seu QTreeWidgetItem está diretamente ligada ao seu modelo de dados, então você deve ligar para o seu QTreeWidget do modelo QAbstractItemModel::dataChanged o sinal a ser notificados da alteração.

Outras dicas

Você tem que pegar o sinal itemChanged ( QTreeWidgetItem * item, int column ) vindo de QTreeWidget.

Ligar o sinal de itemClicked(QTreeWidgetItem* item, int column) da árvore.Ao manusear o sinal, basta verificar item->checkState(column).

A melhor solução encontrada foi implementar setData em um item subclasse:

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);
    }
}

Seria realmente conveniente ter isso em Qt de fato, isso me faz pensar sobre a contribuir com um itemCheckStateChanged sinal diretamente para lá :)

PS:definição de Qt::ItemIsUserCheckable seja desnecessário, esta bandeira é ativado por padrão para todas as QTreeWidgetItems.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top