È possibile creare un segnale per quando è attivata una casella di controllo QTreeWidgetItem?
-
13-12-2019 - |
Domanda
Ho creato una casella di controllo anche un QTreeWidgetItem utilizzando il codice qui sotto.
//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;
}
.
Ho bisogno di un modo per collegare un segnale e uno slot per quando lo stato di questa casella di controllo è cambiato.Il modo attuale che ho implementato questo è qui sotto ma sfortunatamente non funziona.Qualcuno può spiegare cosa sto facendo male e cosa devo fare per farlo connettere?
connect(program, SIGNAL(toggled(bool)), this, SLOT(programChecked(bool)));
. Soluzione
Il QTreeWidgetItem
è collegato direttamente ai dati del modello, in modo da poter collegare il segnale QAbstractItemModel::dataChanged
tagCode del modello di QTREEWIDGET per essere informato della modifica.
Altri suggerimenti
Devi prendere il segnale itemChanged ( QTreeWidgetItem * item, int column )
proveniente da qtreewidget .
Collegare al segnale itemClicked(QTreeWidgetItem* item, int column)
dell'albero.Quando si maneggia il segnale, verificare semplicemente item->checkState(column)
.
La soluzione migliore che abbiamo trovato era per reimplementare SetData in una sottoclasse dell'oggetto:
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);
}
}
.
Sarebbe davvero conveniente averlo in qt, mi fa pensare a contribuire direttamente a un segnale oggetto qui direttamente :)
PS: Impostazione Qt :: ItemISUSERCheckable non è necessaria, questo flag è acceso per impostazione predefinita per tutti i qtreewidgetitems.