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

PyQt Python Discussion :

Menu contextuel masqué par un widget


Sujet :

PyQt Python

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Menu contextuel masqué par un widget
    Bonjour,

    j'ai un souci de menu contextuel quand je fais un clique droit dans un widget QTextEdit. J'ai créé 2 widgets QTextEdit proches l'un de l'autre. Quand je clique sur celui de gauche, le menu contextuel apparaît sous le widget de droite:

    Nom : screenshot.png
Affichages : 135
Taille : 4,3 Ko

    Pour mon application, je ne peux pas faire d'hypothèse sur le placement des widgets.

    J'ai essayé la méthode raise_() sur le widget de gauche mais en vain. Aussi, je n'arrive pas à accéder au menu qui s'affiche pour essayer un raise_() dessus (j'intercepte bien l'événement contextMenuEvent mais ca ne sert à rien).

    Je n'ai pas trop envie de recréer mon propre menu via CustomContextMenu, car le menu par défaut me convient très bien.

    Est-ce qu'il y aurait une solution simple et qui m'aurait échappé? Est-ce un bug connu? Par défaut, les menus devraient être au dessus des autres objets, non?

    Merci pour votre aide!

    PS: ma configuration est la suivante:
    Python 2.7.3 / Qt 4.8.1 / PyQt 4.9.1
    Ubuntu 12.04 LTS (64 bits)e

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 478
    Points : 9 280
    Points
    9 280
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Intrigué par ton problème, j'ai fait un petit code pour vérifier. J'ai défini 2 QTextEdit se chevauchant légèrement, le 2e (fond jaune) placé au dessus du 1er grâce à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.edit1.stackUnder(self.edit2)
    Dans ce cas, le menu popup du 1er reste bien au dessus du 2e, ce qui est normal.

    J'ai fait l'essai sous Windows 7 et sous Mint13 (compatible Ubuntu).

    J'ai à cet occasion découvert que QtDesigner restituait bien les instructions d'ordre Z (tags <zorder>), mais que pyuic4 ne les traduisait pas en Python! Bizarre.

    Voilà mon code d'essai: essaie pour voir si ça marche chez toi. Si le menu popup du 1er est bien au dessus du 2e: ton système n'a pas de bug, et il faudra éplucher ton code pour trouver l'erreur!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    from __future__ import division
     
    import sys, os
     
    from PyQt4 import QtCore, QtGui
     
    class Fenetre(QtGui.QWidget):
     
        def __init__(self, parent=None):
            super(Fenetre, self).__init__(parent)
     
            self.resize(400, 300)
     
            self.edit1 = QtGui.QTextEdit(self)
            self.edit1.setGeometry(QtCore.QRect(35, 80, 104, 71))
     
            self.edit2 = QtGui.QTextEdit(self)
            self.edit2.setGeometry(QtCore.QRect(105, 115, 104, 71))
            self.edit2.setStyleSheet("background-color:yellow")
     
            # place edit1 sous edit2 dans la pile de l'ordre Z
            self.edit1.stackUnder(self.edit2)
     
    if __name__ == "__main__":
        app = QtGui.QApplication(sys.argv)
        fen = Fenetre()
        fen.show()
        sys.exit(app.exec_())

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 311
    Points : 36 813
    Points
    36 813
    Par défaut
    Salut,
    Juste pour info sous windows7, Python 2.7 et QtCore 4.7.4.
    Si je lance le reproducteur de Tyrtamos, j'obtiens la pop-up au dessus avec ou sans appel a .stackUnder.
    - W

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    merci pour vos réponses. Effectivement, j'obtiens un popup normal (i.e. au dessus des 2 QTextEdit) avec le code de Tyrtamos. Je confirme aussi que le comportement est le même avec ou sans appel à stackUnder.

    J'aurais dû en dire plus dans mon 1er post (désolé ): les deux QTextEdit sont placés dans une scène, attaché à un QGraphicsView.

    J'ai placé le code d'essai de Tyrtamos dans ce contexte (en utilisant "QT_Designer" et "Eric"):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    # -*- coding: utf-8 -*-
    from PyQt4 import QtCore, QtGui
     
    try:
        _fromUtf8 = QtCore.QString.fromUtf8
    except AttributeError:
        _fromUtf8 = lambda s: s
     
    class Ui_MainWindow(object):
        def setupUi(self, MainWindow):
            MainWindow.setObjectName(_fromUtf8("MainWindow"))
            MainWindow.resize(800, 600)
            self.centralWidget = QtGui.QWidget(MainWindow)
            self.centralWidget.setObjectName(_fromUtf8("centralWidget"))
            self.gridLayout = QtGui.QGridLayout(self.centralWidget)
            self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
            self.graphicsView = QtGui.QGraphicsView(self.centralWidget)
            self.graphicsView.setObjectName(_fromUtf8("graphicsView"))
            self.gridLayout.addWidget(self.graphicsView, 0, 0, 1, 1)
            MainWindow.setCentralWidget(self.centralWidget)
     
            self.retranslateUi(MainWindow)
            QtCore.QMetaObject.connectSlotsByName(MainWindow)
     
        def retranslateUi(self, MainWindow):
            MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
     
     
    if __name__ == "__main__":
        import sys
        app = QtGui.QApplication(sys.argv)
        MainWindow = QtGui.QMainWindow()
        ui = Ui_MainWindow()
        ui.setupUi(MainWindow)
        MainWindow.show()
     
        # creation d'une scene et association au QGraphicsView
        graphicsScene = QtGui.QGraphicsScene()
        ui.graphicsView.setScene(graphicsScene)
     
        # creation des widgets QTextEdit et ajout dans la scene
        edit1 = QtGui.QTextEdit()
        edit1.setGeometry(QtCore.QRect(35, 80, 104, 71))
        graphicsScene.addWidget(edit1)
     
        edit2 = QtGui.QTextEdit()
        edit2.setGeometry(QtCore.QRect(105, 115, 104, 71))
        edit2.setStyleSheet("background-color:yellow")
        graphicsScene.addWidget(edit2)
     
        sys.exit(app.exec_())
    Et du coup, la popup reste bien sous le 2ème QTextEdit:

    Nom : screenshot2.png
Affichages : 152
Taille : 8,9 Ko

    Je vais encore fouiller du coté des objets QGraphicsView et QGraphicsScene. Le comportement par défaut doit être altéré par quelque chose dans ce contexte particulier.

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Bon ben, j'ai eu beau chercher partout, je pense que c'est un bug dans la gestion des popups au niveau de QGraphicsView.

    Finalement, j'ai trouvé le moyen de récupérer l'objet QMenu correspondant à la fenêtre contextuelle. J'ai surchargé la méthode contextMenuEvent en définissant ma propre classe QTextEdit. Avec createStandardContextMenu, on crée le menu par défaut (on peut même y ajouter des actions, donc c'est plutôt pas mal!):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def contextMenuEvent(self, QContextMenuEvent):
                self.QMenu = self.createStandardContextMenu()
                self.QMenu.exec_(QContextMenuEvent.globalPos())
    J'ai tout essayé:
    - raise_() sur l'objet self.QMenu,
    - définir la fenêtre principale comme parent,
    - définir "None" comme parent (qui aurait pour conséquence d'affecter une fenêtre toplevel)
    - etc

    mais rien n'y fait . Le popup s'affiche toujours sous le widget de droite au lieu d'être au dessus.

    Pour aller plus loin, je pense qu'il faudrait tester en C++ avec Qt plutôt que pyQt. Si le comportement est le même, ça vaut peut être le coup de remonter ça comme un bug (mais à qui, et via quel site? j'ai rien vu sur qt.digia.com...)

    Je vais essayer de créer mon propre menu en repartant de zéro (création d'une fenêtre, ajout d'un menu, ajout des actions, etc).

    Si quelqu'un a d'autres idées, je suis preneur.

    Merci !

Discussions similaires

  1. [AC-2007] Suppression d'un menu contextuel créé par macro
    Par spaiku dans le forum IHM
    Réponses: 2
    Dernier message: 10/11/2010, 10h29
  2. menu contextuel caché par une frame :cry:
    Par bidule_chose dans le forum Dreamweaver
    Réponses: 2
    Dernier message: 30/10/2008, 14h11
  3. Menu contextuel appelé par 2 cliques de souris !
    Par soso78 dans le forum VB 6 et antérieur
    Réponses: 14
    Dernier message: 27/07/2007, 20h11
  4. menu déroulant masqué par animation flash
    Par matperino dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 11/12/2005, 12h56

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