2016-08-03 4 views
0

J'ai récemment rencontré exit code 255 dans mon application Qt 5.7. Cela est arrivé juste après que j'ai ajouté ma coutume QGestureRecognizer. J'ai débogué dans les sources du Qt et j'en suis arrivé à la conclusion que le QGestureManager dispose automatiquement de toutes les instances QGestureRecognizer. La ligne qui provoque le problème est à l'intérieur du destructor widget où le reconnaisseur est créé et enregistré:QGestureRecognizer automatiquement détruit par QGestureManager?

Demo::~Demo() { 
    // delete other stuff 

    delete recognizer; 
} 

La chose est QGestureRecognizer ne supporte pas (au moins en fonction de la documentation et en regardant la signature du constructeur) la relation parent-child dans Qt car elle n'est pas dérivée de QObject (ou de toute sous-classe de cette classe Qt fondamentale). Cela signifie que l'on ne peut pas affecter un parent au constructeur its, donc QCustomGestureRecognizer recognizer = new QCustomGestureRecognizer (this) n'est pas possible. Poursuivant cette ligne de pensée, cela signifie que l'on doit déclencher manuellement le destructeur en appelant le delete recognizer. Ou alors je pensais ...

À la fin de la vie de mon application, le QGestureManager est appelé. Dans là il y a une liste de reconnaisseurs appelés m_recognizers. Il contient un tas de reconnaisseurs intégrés (comme celui pour le geste Tap) ainsi que le système de reconnaissance personnalisé enregistré (dans mon cas, il était enregistré sous le numéro 257). Le destructeur de QGestureManager itère dans la liste et supprime ses entrées.

Lorsque la ligne delete recognizer est présent je reçois une erreur de segmentation lors qDeleteAll(...) (pour le m_recognizers) atteint l'entrée de la reconnaissance personnalisée, car il tente de supprimer quelque chose qui a déjà été supprimé. Après avoir commenté la ligne delete recognizer dans le destructeur de mon widget, je ne suis plus confronté au problème mais je ne sais toujours pas si je ne romps pas mon code quelque part. Le code de sortie n'est pas (comme prévu) un 0 mais les informations sur la façon dont les reconnaisseurs sont éliminés sont complètement manquantes dans la documentation officielle.

Est-ce que quelqu'un a rencontré ce problème? Je n'exclus pas la possibilité que le problème provienne d'une autre partie de mon code, bien qu'il semble assez improbable étant donné qu'il apparaît lorsque le destructeur QWidget par défaut est appelé. Conformément à la norme C++ lors de l'héritage d'une classe, le destructeur de la sous-classe est appelé (dans mon cas, il s'agit du widget personnalisé Demo - aucun problème), puis de la classe de base.

Répondre

1

Si vous utilisez

Qt::GestureType QGestureRecognizer::registerRecognizer(QGestureRecognizer *recognizer) 

le système ne prend possession de l'objet et vous ne devez pas supprimer vous-même.

Extrait de la Documentation:

L'application prend possession de la reconnaissance et renvoie l'ID de type geste qui lui est associé.

+0

Merci. Je me suis dit que: P C'est toujours agréable de voir que c'est mentionné dans la documentation. – rbaleksandar