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

È stato utile?

Soluzione

Il QTreeWidgetItem è collegato direttamente ai dati del modello, in modo da poter collegare il segnale QAbstractItemModel::dataChangedtagCode 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top