J'ai créé un petit widget moi-même, y compris un QProgressBar et un QLabel dans un QVBoxLayout. Il a aussi une fonction qui renvoie le texte de l'étiquette (auto-créé). Maintenant dans ma MainWindow j'ai deux autres QHBoxLayouts et je veux glisser et déposer mon widget de l'un à l'autre. Cela fonctionne aussi quand je clique sur le peu d'espace libre entre le QLabel et le QProgressBar. Mais quand j'ai cliqué sur l'un d'entre eux directement, l'application s'est écrasée et a brûlé douloureusement.
Je sais aussi où ça échoue. Mon mousePressEvent
ressemble à ceci:Qt glisser-déposer avec ses propres widgets?
void DragDrop::mousePressEvent(QMouseEvent *event) {
// !!!!---- make sure ONLY MyWidgets are here, else: CRASH ----!!!!
MyWidget *child = static_cast<MyWidget*>(childAt(event->pos()));
if (!child)
return;
qDebug() << child->returnLabelText();
...
}
Alors, quand je clique sur la barre de progression, il sera jeté ProgressBar, pas votre widget. Et parce que le QProgressBar n'a pas une fonction comme returnLabelText()
(mais mon widget fait) il échoue.
Quelle est la meilleure méthode pour obtenir mon widget?
qobject_cast serait mieux que dynamic_cast, juste FYI .. – ianmac45
ianmac45 est juste ... dans le contexte de QObjects, qobject_cast est fortement préféré car il ne dépend pas de RTTI. – Fred