IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Qt Discussion :

QWidget et multiple appel à resizeEvent


Sujet :

Qt

  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Points : 718
    Points
    718
    Par défaut QWidget et multiple appel à resizeEvent
    Bonjour tout le monde,

    J'ai créé un Widget dans lequel j'ai redéfini l’événement virtual void wheelEvent(QWheelEvent*) dans lequel, j'agrandi ou rétréci mon widget (avec resize()):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void Widget::wheelEvent(QWheelEvent *event)
    {
      qDebug() << "wheelEvent";
      if (event->delta() > 0)
      {
        resize(width() * 1.25, height());
      }
      else
      {
        resize(width() * 0.75, height());
      }
    }
    Je me suis aperçu que resizeEvent est appelé deux fois à chaque redimensionnement.

    Je ne comprends vraiment pas pourquoi. J'ai passé le debugger pour voir l'appel des fonctions, mais ça ne m'as pas plus éclairé.

    Quelqu'un aurait-il une explication?

    Merci

  2. #2
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Points : 5 545
    Points
    5 545
    Par défaut
    Bonjour,

    En effet, en testant, on constate bien que pour un unique wheelEvent(), on obtient deux resizeEvents(). Cependant, sur ces deux resizeEvents (ayant tous deux respectivement les mêmes valeurs de oldSize() et de size()), par le biais de la méthode spontaneous() du QResizeEvent* reçu, on constate que le premier resizeEvent() prend pour origine une demande de Qt (le resize()) tandis que le second provient du système, certainement en réaction à la demande de redimensionnement de l’application par Qt.

    Après quelques tests, ma théorie est la suivante :

    1) Dans le cas d'un widget de haut-niveau (le widget de la fenêtre), un resize va mener Qt à envoyer un resizeEvent() non spontané pour redimensionner le widget tandis que le système va demander de redimensionner le widget principal de l'application suite au changement de la taille de la fenêtre, d'où le 2e resizeEvent() quant à lui spontané ;
    2) Dans le cas d'un widget contenu dans un autre widget, seul un resizeEvent() non spontané est appelé vu qu'il n'a pas impacté le système par son redimensionnement.

    Désolé pour la clarté, je ne vois pas trop comment définir ça mieux.

    Bonne soirée,
    Louis
    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

  3. #3
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Points : 718
    Points
    718
    Par défaut
    Merci pour ta réponse!

    Du coup, je suppose que l'on ne puisse pas éviter ce comportement.

  4. #4
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Points : 5 545
    Points
    5 545
    Par défaut
    Bonjour,

    L'éviter, non, à part en mettant le widget recevant le wheelEvent() dans un widget parent, mais dans l'absolu, il faut considérer qu'il y aura au minimum un resizeEvent() suite à un appel à la méthode resize() avec de nouvelles dimensions. Si vous avez réellement besoin du resizeEvent(), alors vous pouvez vérifier avec event->spontaneous() si l'événement provient du code ou bien du système.

    Bonne journée à vous,
    Louis
    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

  5. #5
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Points : 718
    Points
    718
    Par défaut
    Merci pour toutes ces précisions. Je pense que je vais utiliser event()->spontaneous().

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Multiples appels asynchrones et traitements paralleles
    Par zax-tfh dans le forum Windows Communication Foundation
    Réponses: 11
    Dernier message: 27/05/2011, 10h57
  2. Multiples appels d'une servlet pour une seule requête !
    Par threshold dans le forum Firefox
    Réponses: 0
    Dernier message: 08/09/2008, 14h13
  3. Réponses: 6
    Dernier message: 12/07/2006, 19h29
  4. [KeyEvent] Problème de multiples appels
    Par pierre.zelb dans le forum AWT/Swing
    Réponses: 13
    Dernier message: 11/08/2005, 14h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo