Bonsoir,
Je dois créer un gestionnaire de tâches. Donc j'ai une classe Tâche qui contient différentes informations dont un booléen que j'ai appelé "checked", pour savoir si la tâche est validée ou non.
Pour afficher ces tâches, j'utilise un QTreeWidget. Chaque tâche est représentée par un QTreeWidgetItem et dans chaque "data", j'ai stocké les informations d'une tâche.
Dès que je coche (ou décoche) la checkbox d'une tâche, je souhaite que les sous-tâches soient cochées ou non en fonction de cette tâche parente. De ce côté-là, pas de soucis. Mais je souhaite aussi que la "data" du QTreeWidgetItem soit mise à jour.
J'espère que tout ce que je viens de dire est compréhensible.
Voici mon code :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| void mainWindow::updateCheck(QTreeWidgetItem* parent) {
widget.save->setEnabled(true);
Qt::CheckState checkState = parent->checkState(0);
QVariant var = parent->data(0, Qt::UserRole);
Tache t = var.value<Tache>();
if (checkState == Qt::Checked) {
t.setChecked(true);
}
else {
t.setChecked(false);
}
var.setValue(t);
parent->setData(0,Qt::UserRole,var); // Problème !!
for(int i = 0; i < parent->childCount(); ++i) {
parent->child(i)->setCheckState(0, checkState);
updateCheck(parent->child(i));
}
} |
Le problème arrive à la ligne avec un segfault :
parent->setData(0,Qt::UserRole,var);
Une petite idée ?
J'ai une deuxième question.
Pour appeler la méthode précédente, je connecte un signal à un slot comme ceci :
QObject::connect(widget.treeWidget, SIGNAL(itemChanged(QTreeWidgetItem*,int)), this, SLOT(updateCheck(QTreeWidgetItem*)));
Mais lorsque je modifie le nom d'une tâche (avec setText()), la méthode est aussi appelée. Donc, ça change les checkbox des sous-tâches.
Il y a-t-il un moyen de changer le texte, sans que la méthode, qui met à jour les checkbox, soit appelée ?
Partager