首页 > 解决方案 > 如何在 PyQt5 中保留隐藏小部件的快捷方式?

问题描述

我有一个带有与其关联的快捷方式的菜单栏。我想隐藏菜单栏,但在这种情况下,关联的快捷方式将被禁用。这是一个例子:

import sys

from PyQt5.QtWidgets import QApplication, QMainWindow, QAction

class Window(QMainWindow):
    def __init__(self):
        super().__init__()
        self.InitWindow()

    def InitWindow(self):
        mainMenu = self.menuBar()
        fileMenu = mainMenu.addMenu("&File")

        mainMenu.hide()    # comment it and the shortcut 'q' will work

        quitItem = QAction("Quit", self)
        quitItem.setShortcut("Q")
        quitItem.triggered.connect(self.close)

        fileMenu.addAction(quitItem)

if __name__ == "__main__":
    App = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(App.exec())

如果您将该行mainMenu.hide()放在注释中,即如果显示菜单栏,则应用程序。将使用快捷方式 ' q' 退出。如何保留隐藏小部件的快捷方式?

在应用程序中。我想添加全屏支持,在这种情况下我想隐藏菜单栏,而且我想将快捷方式保持在全屏模式。

标签: qtpyqt5

解决方案


我找到了一个可行的解决方案。思路如下:主窗口有一个快捷方式(本例中为'q'),菜单栏也有这个快捷方式。为避免冲突,如果存在菜单栏,请禁用窗口的快捷方式。如果菜单栏被隐藏,请启用窗口的快捷方式。

import sys

from PyQt5.QtCore import Qt
from PyQt5.QtGui import QKeySequence
from PyQt5.QtWidgets import QApplication, QMainWindow, QAction, QShortcut

class Window(QMainWindow):
    def __init__(self):
        super().__init__()

        self.shortcutQuit = QShortcut(QKeySequence("q"), self)
        self.shortcutQuit.activated.connect(self.close)
        self.shortcutQuit.setEnabled(False)    # disable it if the menu bar is visible

        self.InitWindow()

    def InitWindow(self):
        self.mainMenu = self.menuBar()
        fileMenu = self.mainMenu.addMenu("&File")

        hideItem = QAction("Hide Menu Bar", self)
        hideItem.setShortcut("h")
        hideItem.triggered.connect(self.my_hide)

        quitItem = QAction("Quit", self)
        quitItem.setShortcut("Q")
        quitItem.triggered.connect(self.close)

        fileMenu.addAction(hideItem)
        fileMenu.addAction(quitItem)

    def my_hide(self):
        self.mainMenu.hide()
        self.shortcutQuit.setEnabled(True)

if __name__ == "__main__":
    App = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(App.exec())

推荐阅读