É possível criar um sinal para quando um QTreeWidgetItem caixa de seleção é alternada?
-
13-12-2019 - |
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)));
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.