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 :

Surcharger la méthode showEvent de QMenu


Sujet :

PyQt Python

  1. #1
    Membre averti
    Inscrit en
    Décembre 2010
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 21
    Par défaut Surcharger la méthode showEvent de QMenu
    Bonjour,

    J'ai besoin de disabler un item de menu sous condition.
    Le plus simple m'a semblé de surcharger showEvent du QMenu en question mais je ne m'en sors pas.
    Je me suis basé sur plusieurs exemples trouvés sur le net:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    from PyQt5.QtWidgets import QMenu
     
    class MenuEdit(QMenu):
        def __init__(self, parent):
            QMenu.__init__(self)
     
        def showEvent(self, event):
            print("showEvent")
            QMenu.showEvent(self, event)
    Voici ce que j'obtiens:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Exception "unhandled TypeError"
    QWidget.showEvent(QShowEvent): argument 2 has unexpected type 'method'
    Si je supprimer la ligne cela semble fonctionner mais je crois qu'il faut renvoyer l'event pour coder proprement, non?
    Savez vous comment régler le problème?

    Merci

  2. #2
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    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 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    J'en suis encore à PyQt4, mais si c'est la même chose avec PyQt5, pour "disabler" (!) un item de menu, ça se fait en agissant sur le QAction concerné avec .setEnabled(False), et on peut interroger son état avec .isEnabled(). On peut d'ailleurs le faire disparaître carrément avec .setVisible(False).

  3. #3
    Membre averti
    Inscrit en
    Décembre 2010
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 21
    Par défaut
    Merci pour ta participation.

    Mon problème n'est pas de disabler l'item! (dans ce cas, le titre de mon post aurait été "Comment désactiver un item de menu").N'est là que pour "debugger".

    Comme je l'ai indiqué, en supprimant la ligne 9 tout semble fonctionner correctement. Ce n'est donc pas bloquant.
    Mais
    Sur cet exemple (un QMenu) ce n'est peut-être pas important mais si je devais surcharger showEvent sur un autre QWidget cela pourrait poser un réel problème.
    Et plus généralement, ce qui m'embête, c'est de ne pas répercuter l'event.

    Je débute en Python/Qt et je préfère prendre dès le départ les bonnes habitudes.

    Pour ce qui est de Qt4/Qt5, d'après ce que j'ai lu les différences sont minimes et je suis loin d'avoir le niveau de les détecter

  4. #4
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Je ne peux pas reproduire ton problème.

    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
     
    # -*- coding: utf-8 -*-
     
    from PyQt5 import QtCore, QtGui, QtWidgets
     
    class Ui_MainWindow(object):
        def setupUi(self, MainWindow):
            self.centralwidget = QtWidgets.QWidget(MainWindow)
            self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
            self.tableView = QtWidgets.QTableView(self.centralwidget)
            self.gridLayout.addWidget(self.tableView, 0, 0, 1, 1)
            MainWindow.setCentralWidget(self.centralwidget)
            self.menubar = QtWidgets.QMenuBar(MainWindow)
            self.menuFile = Menu(self.menubar)
            self.menuFile.setTitle("File")
            self.menubar.addAction(self.menuFile.menuAction())
            MainWindow.setMenuBar(self.menubar)
     
     
    class Menu(QtWidgets.QMenu):
        def __init__(self, parent=None):
            super(Menu, self).__init__(parent)
            self.actionNew = QtWidgets.QAction("New", parent)
            self.actionOpen = QtWidgets.QAction("Open", parent)
            self.actionClose = QtWidgets.QAction("Close", parent)
            self.addAction(self.actionNew)
            self.addAction(self.actionOpen)
            self.addAction(self.actionClose)
     
        def showEvent(self, event):
            print(event)
            QtWidgets.QMenu.showEvent(self, event)
     
    if __name__ == "__main__":
        import sys
        app = QtWidgets.QApplication(sys.argv)
        MainWindow = QtWidgets.QMainWindow()
        ui = Ui_MainWindow()
        ui.setupUi(MainWindow)
        MainWindow.show()
        sys.exit(app.exec_())
    Le message d'erreur que tu obtiens semble indiquer que tu as une méthode nommée event et, donc, ne correspond pas au code que tu montres.


    Pour désactiver un item de menu, nul besoin de le faire lors d'un showEvent, tu peux le faire à tout moment.

  5. #5
    Membre averti
    Inscrit en
    Décembre 2010
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 21
    Par défaut
    Hello VinsS,

    Ton code fonctionne parfaitement.
    Je viens de reprendre le mien et j'ai retiré la ligne que j'avais laissé en commentaire.

    Plus d'erreur!! - A n'y rien comprendre!!

    Mon code est suffisament court pour que je sois certain qu'il n'y avait pas d'erreur de syntaxe ni de méthode event nul part.

    Bref, toutes mes excuses à vous deux et merci à toi.

    Citation Envoyé par VinsS Voir le message
    Pour désactiver un item de menu, nul besoin de le faire lors d'un showEvent, tu peux le faire à tout moment.
    Le showEvent m'est nécessaire pour détecter l'ouverture du menu et donc décider si il faut désactiver l'item en question.

Discussions similaires

  1. [POO] Héritage et surcharge de méthodes
    Par defkid dans le forum Langage
    Réponses: 4
    Dernier message: 26/02/2007, 14h51
  2. surcharge de méthode
    Par Zen_Fou dans le forum Langage
    Réponses: 2
    Dernier message: 22/03/2006, 10h23
  3. [POO] Surcharge de méthode
    Par ouioui2000 dans le forum Langage
    Réponses: 4
    Dernier message: 09/03/2006, 15h25
  4. [Custom Tags] Problème avec une surcharge de méthode
    Par Strab dans le forum Taglibs
    Réponses: 19
    Dernier message: 26/08/2005, 16h34
  5. Comment surcharger la méthode OnClose d'un TFrame ?
    Par sdebrois dans le forum Composants VCL
    Réponses: 2
    Dernier message: 17/01/2005, 20h57

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