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 :

Focus Off dans une QListWidget


Sujet :

Qt

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur SIG
    Inscrit en
    Juillet 2023
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur SIG
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2023
    Messages : 8
    Points : 3
    Points
    3
    Par défaut Focus Off dans une QListWidget
    Bonjour,

    Avec QT Designer, j'ai placé dans mon IHM un QListWidget et je voudrais utiliser l’événement de perte de focus (FocusOff).
    Hors il ne me propose pas cet événement. alors que je suis pratiquement sûr qu'il existe.

    Avez-vous une idée ?

    Merci et bonne journée

    PYJ

  2. #2
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 669
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 669
    Points : 188 683
    Points
    188 683
    Par défaut


    Pas de signal à ma connaissance, mais tu peux jouer avec des événements : https://doc.qt.io/qt-6/qwidget.html#focusOutEvent.

  3. #3
    Candidat au Club
    Homme Profil pro
    Développeur SIG
    Inscrit en
    Juillet 2023
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur SIG
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2023
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Bonjour
    Merci pour la réponse
    Mais étant débutant aussi bien en python qu'en QT, je ne vois pas la différence entre un signal et un evenement.

    Concernant mon cas, c'est pour du QGIS, et c'est un développement de plugin.

    QT m'a générer plusieurs fichiers .py. un pour l'IHM (TracesOfficiels_dialog.py et un autre (TracesOfficiels.py)

    J'ai déjà placé mes signaux dans TracesOfficiels.py
    ex : self.dlg.Bt_ValiderZoneGeo.pressed.connect(self.PRT_ValiderZones)

    Mais je ne sais pas comment procéder pour les evenements

    Merci de ton aide

    Fichier joint : tracesofficiels.zip

    PYJ

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 627
    Points : 30 692
    Points
    30 692
    Par défaut
    Salut,

    Mais étant débutant aussi bien en python qu'en QT, je ne vois pas la différence entre un signal et un evenemeny.
    On va essayer de faire simple:

    Un evenement représente la réaction "du système" (de gestion des entrées et sorties) face à une action de l'utilisateur :

    A chaque fois que tu enfonces une touche, que tu bouge ta souris ou que tu enfonces un bouton de ta souris, "le système" va émettre un événement indiquant que "telle touche" a été enfoncée, que la souris s'est déplacée "en telle position" ou que "tel bouton" de la souris a été enfoncé alors qu'elle se trouvait en "telle position".

    Si ces événements surviennent alors que ta fenêtre a le focus et -- pour ce qui concerne la souris -- alors que la souris se trouve "quelque part" sur ta fenêtre, alors la fenêtre va y réagir en fonction des circonstances, par exemple (pour les événements qui nous intéressent ici)
    • Si c'est la touche <tab> qui a été enfoncée,
      • en envoyant à l'élément actif de l'IHM un événement indiquant "tu perds le focus"
      • en envoyant à l'élément suivant dans la liste d'activation des éléments de l'IHM un événement "tu prends le focus"
    • S'il s'agit d'un clique de la souris
      • en envoyant à l'élément actif de l'IHM un événement indiquant "tu perds le focus"
      • en envoyant à l'élément susceptible d'être activé qui se trouve en dessous de la sours un événement "tu prends le focus"

    Et, bien sur, chaque élément ayant recu un événément va y réagir de manière adéquate:
    • l'élément actif ayant recu l'événement "tu perds le focus" va réagir en plaçant son "flag" représentant le fait qu'il a le focus à false
    • l'élément actif ayant recu l'événément "tu prend le focus" va réagir en placant son "flag" représentant le fait qu'il a le focus à true

    Mais ce n'est pas tout: Si ces éléments sont équipés des signaux correspondant, ils vont envoyer une communication à "tous ceux que cela intéresse" indiquant le fait que leur état vient de changer.

    Et voilà qui nous amène "naturellement" à parler des signaux (et des slots)...

    Le système de signaux est un système de "communication transversale", dans le sens où quand "il arrive quelque chose" à un élément bien particulier de ton IHM, il peut agir un peu comme une station de radio, qui émetterait un message comme
    Ohé tout le monde, il m'arrive "ceci"
    Seulement, il n'y aura que "ceux qui sont branché sur la bonne fréquence" qui auront l'information.

    Allez, pour faire plus "hype", on pourrait prendre la comparaison avec les différents résaux sociaux : tu prends une chouette photo de toi, d'un moment de ta vie, et tu l'envoie en disant "coucou, voyez la belle photo", "simplement" en espérant que cela puisse intéreser quelqu'un.

    Mais les résaux sociaux ne vont signaler ce moment de ta vie qu'à ... ceux qui ont indiqué avoir un intérêt quelconque pour ce qui t'arrive qui seront tenus au courant et qui pourront éventuellement réagir à la communication qui leur a été faite

    Le comportement adopté par les gens "tenus au courant" du fait particulier qui arrive à un élément particulier s'appelle un "slot" et "tout le jeu" consiste donc à "connecter" un slot particulier correspondant à une réaction particulière d'un élément bien précis de ton système face à un événement particulier survenu à un élément bien spécifique du système sans qu'il n'y ait correllation entre les deux éléments (celui qui émet le signal et celui qui le recoit).

    Au final, nous pourrions donc dire qu'un événement est une communication "verticale" ( car elle part systématiquement de l'élément "le plus important" vers l'élément "le moins important") "automatique" alors que les signaux (et les slots qui y sont reliés) est une communication "transversale" (car "n'importe quel" élément peut être tenu au courant de "n'importe quel événement" survenant à "n'importe quel autre" élément) basé sur transmission volontaire du fait que le changement d'état vient de survenir

  5. #5
    Candidat au Club
    Homme Profil pro
    Développeur SIG
    Inscrit en
    Juillet 2023
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur SIG
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2023
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Re,
    Ce qui en fait est déroutant, c'est que dans d'autres langage, que ce soit un clic sur un bouton ou bien justement la perte de focus d'un widget, le traitement est le même

    Donc dans mon cas, comment et où puis-je faire en sorte qu’une fonction se déclenche lorsque je clic sur un autre widget de mon IHM ?

    Dans mon IHM, une QListWidget dans laquelle j'ai des cases à cocher, et je voudrais que quand je clique sur un autre élément de mon IHM (quel qu’il soit), un traitement se fasse

    Merci encore

    Voir mes fichiers py dans mon post précédent
    PYJ

  6. #6
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 669
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 669
    Points : 188 683
    Points
    188 683
    Par défaut
    Ce qu'il faut faire exactement, c'est créer une nouvelle classe qui dérive de QListWidget et redéfinit la méthode focusOutEvent. Celle-ci peut se limiter à émettre un signal (à toi de le créer aussi) et appeler la méthode correspondante de QListWidget. En C++ (non testé !), ça ressemblerait à ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class ListWithFocusOutWidget : public QListWidget {
      Q_OBJECT
     
    signals:
      void focusOut();
     
    protected:
      void focusOutEvent(QFocusEvent* e) {
        emit valueChanged;
        QListWidget::focusOutEvent(e);
      }
    };
    À voir la traduction en Python dans ton cas. Une tentative :

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class ListWithFocusOutWidget(QListWidget):
      focusOut = Signal()
     
      def __init__(self):
        QListWidget.__init__(self)
     
      def focusOutEvent(self, event):
        self.focusOut.emit()
        QListWidget.focusOutEvent(self, event)

    De manière générale, les événements et signaux-slots servent à la même chose. Les événements sont un peu plus bas niveau que les signaux, ils servent à implémenter un widget plutôt qu'à l'utiliser dans une application. Je trouve aussi étonnant qu'il n'y ait pas de signal pour ce cas d'utilisation, peut-être pour des raisons de performance.

  7. #7
    Candidat au Club
    Homme Profil pro
    Développeur SIG
    Inscrit en
    Juillet 2023
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur SIG
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2023
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    OK, je regarderais demain

    Et dans quel fichier.py je dois le mettre (_dialog.py, extension.py, autre ?

    Merci encore

    PYJ

  8. #8
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 669
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 669
    Points : 188 683
    Points
    188 683
    Par défaut
    Un fichier à part, juste pour cette classe, que tu importes après ?

  9. #9
    Membre régulier

    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2023
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Octobre 2023
    Messages : 53
    Points : 101
    Points
    101
    Par défaut
    Citation Envoyé par pyjoubert Voir le message
    Bonjour,

    Avec QT Designer, j'ai placé dans mon IHM un QListWidget et je voudrais utiliser l’événement de perte de focus (FocusOff).
    Hors il ne me propose pas cet événement. alors que je suis pratiquement sûr qu'il existe.

    Avez-vous une idée ?

    Merci et bonne journée

    PYJ
    Et peut-être en capturant la cible de mousePressEvent ou mousReleaseEvent ou mouseMoveEvent ?

Discussions similaires

  1. Check box dans une QListWidget et un filtre
    Par R2D2 le vrai dans le forum PyQt
    Réponses: 13
    Dernier message: 02/01/2020, 21h37
  2. focus form dans une dll
    Par edam dans le forum Langage
    Réponses: 8
    Dernier message: 27/01/2012, 17h12
  3. Taille d'icône dans une QListWidget
    Par france38 dans le forum Débuter
    Réponses: 3
    Dernier message: 29/04/2011, 09h25
  4. focus dans une cellule d'une JTable
    Par coil dans le forum Composants
    Réponses: 5
    Dernier message: 07/07/2010, 17h15
  5. Focus automatique dans une listview lors d'un SelectedItems
    Par Chacha35 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 28/09/2009, 11h19

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