Es posible crear una señal para cuando un QTreeWidgetItem casilla de verificación se activa?
-
13-12-2019 - |
Pregunta
He creado una casilla de verificación que también es un QTreeWidgetItem utilizando el siguiente código.
//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;
}
Necesito una manera de conectar una señal y ranura para cuando el estado de esta casilla de verificación está cambiado.La forma actual en que he implementado este es inferior, pero lamentablemente no funciona.Puede alguien explicar lo que estoy haciendo mal y lo que tengo que hacer para conseguir que se conecte?
connect(program, SIGNAL(toggled(bool)), this, SLOT(programChecked(bool)));
Solución
Su QTreeWidgetItem
está directamente vinculado a su modelo de datos, por lo que debe conectarse a su QTreeWidget del modelo del QAbstractItemModel::dataChanged
de la señal a ser notificado del cambio.
Otros consejos
Tienes que agarrar el código de generación de señales que viene de qtreewidget .
Conectarse a la señal de itemClicked(QTreeWidgetItem* item, int column)
del árbol.Cuando el manejo de la señal, acabo de comprobar item->checkState(column)
.
La mejor solución que encontramos fue el reempliamiento de SetData en un subclase de artículos:
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);
}
}
Realmente sería conveniente tener esto en QT de hecho, me hace pensar en contribuir a contribuir con una señal de SobreCheckStateChanged allí directamente :)
PS: Configuración QT :: ItemIsUSUSURCHECKABLE es innecesario, esta bandera está encendida de forma predeterminada para todos los QTeeWidgetItems.