Python >> Tutoriel Python >  >> Python GUI >> PyQt GUI

MenuBar manquant dans PyQt5

Ce n'est pas un bogue Qt et PyQt5.

Je pense que votre code est le tutoriel de la barre de menus zetcode pyqt5. J'ai rencontré exactement le même problème sur Mac OS.

La première solution est une astuce. Utilisez ' &Exit' au lieu de '&Exit' . Insérer un espace au début de '&Exit' comme ceci :

...
# exitAction = QAction(QIcon('exit.png'), '&Exit', self) # Not shown
exitAction = QAction(QIcon('exit.png'), ' &Exit', self)
...

La barre de menu à l'échelle du système de macOS réserve des mots-clés tels que "Exit" , "Quit" , et etc. Pour la même raison, l'exemple de code de yurisnm ne montre que les éléments de menu sauf "Quit" sur MacOS. En fait, "Quitter" a TextHeuristicRole, donc remplace le comportement "Quitter" dans le menu Application. Lorsque vous cliquez sur "Quitter python" dans le menu "Python", il ne se ferme pas et affiche simplement "quitter déclenché".

Si vous devez utiliser ce nom dans un autre menu (par exemple, Fichier, Modifier), vous devez modifier le nom de l'action comme ci-dessus ou utiliser QAction::setMenuRole(...) comme ceci :

...
exitAction = QAction(QIcon('exit.png'), '&Exit', self)
print(exitAction.menuRole()) # It prints "1". QAction::TextHeuristicRole
exitAction.setMenuRole(QAction.NoRole)
...

Veuillez lire ce qui suit, cela vous aidera.

  • https://stackoverflow.com/a/11387977/5362866

  • http://doc.qt.io/qt-5/qmenubar.html#qmenubar-as-a-global-menu-bar


La barre de menus n'est pas visible dans PyQt5

bar = self.menuBar()

bar.setNativeMenuBar(False)

file = bar.addMenu("File")

file.addAction("New")

La propriété NativeMenuBar spécifie si la barre de menus doit être utilisée ou non comme barre de menus native sur les plates-formes qui la prennent en charge. Si cette propriété est vraie, la barre de menus est utilisée dans la barre de menus native et n'est pas dans la fenêtre de son parent, si elle est fausse la barre de menus reste dans la fenêtre.

Exemple de programme

import sys

from PyQt5.QtWidgets import QMainWindow, QAction, qApp, QApplication

from PyQt5.QtGui import QIcon


class Menu(QMainWindow):

    def __init__(self):
        super().__init__()
        self.initUI()


    def initUI(self):               

        exitAct = QAction(QIcon('exit.png'), ' &Quit', self)   

        exitAct.setShortcut('Ctrl+Q')
        exitAct.setStatusTip('Exit application')
        exitAct.triggered.connect(qApp.quit)

        self.statusBar()

        menubar = self.menuBar()
        menubar.setNativeMenuBar(False)
        fileMenu = menubar.addMenu('&File')
        fileMenu.addAction(exitAct)

        bar = self.menuBar()
        file = bar.addMenu("Edit")
        file.addAction("New")

        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('Simple menu')    
        self.show()


if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Menu()
    sys.exit(app.exec_())

Si votre programme s'exécute sur Ubuntu, vous pouvez trouver votre barre de menus en haut de l'écran.

Si vous souhaitez déplacer la barre de menus vers la barre de titre de la fenêtre, vous pouvez basculer le paramètre dans "Paramètres système / Apparence / Comportement / Afficher les menus d'une fenêtre / Dans la barre de titre de la fenêtre".