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)));
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top