我一直在使用PyQt5开发GUI,并希望包含一个菜单栏。但是,当我编写此功能的代码时,将不会出现我的菜单。弄清我对如何在PyQt5中实现菜单栏的理解之后,我在网上寻找了一个预先存在的示例。通过一些调整,我开发了以下测试用例:
import sys
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QApplication, QMainWindow, QMenuBar, QAction, qApp
class Example(QMainWindow):
def __init__(self):
super().__init__()
exitAction = QAction(QIcon('exit.png'), '&Exit', self)
exitAction.triggered.connect(qApp.quit)
menubar = self.menuBar()
fileMenu = menubar.addMenu('&Testmenu')
fileMenu.addAction(exitAction)
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
但是,当我运行此命令时,找不到
Testmenu
。在使用pyuic5将.ui文件转换为可导入的.py之前,我还尝试了在QTCreator中创建菜单栏(以及我的GUI布局的其余部分)。我以为这样可以消除一些编程错误,但是菜单栏仍然不会显示。有什么想法吗?
编辑:
我在Jupyter笔记本4.1版中使用Python 3.5(Anaconda 4.1)运行此代码。我还使用了运行OS 10.1l,PyQt 5.7和Qt版本5.7.0的Macbook。
我已经意识到,如果我单击应用程序窗口,然后再单击回到窗口,菜单栏将变得敏感-有效地使应用程序失去焦点并集中精力。有了这些信息,我意识到我不是第一个注意到此问题的人(请参阅https://github.com/robotology/yarp/issues/457)。不幸的是,我仍然不确定如何解决该问题。
最佳答案
这不是Qt和PyQt5错误。
我认为您的代码是zetcode pyqt5 menubar tutorial。我在Mac OS上遇到了完全相同的问题。
第一个解决方案是一个把戏。使用' &Exit'
而不是'&Exit'
。像这样在'&Exit'
的开头插入一个空格:
...
# exitAction = QAction(QIcon('exit.png'), '&Exit', self) # Not shown
exitAction = QAction(QIcon('exit.png'), ' &Exit', self)
...
macOS的系统级菜单栏保留诸如
"Exit"
,"Quit"
等的关键字。出于相同的原因,yurisnm's example code仅显示Mac OS上除"Quit"
之外的菜单项。实际上,“Quit”具有TextHeuristicRole,因此将覆盖“应用程序”菜单中的“Quit”行为。当您在“Python”菜单中单击“退出python”时,它不会退出,而仅显示“退出触发”。如果您必须在其他菜单中使用该名称(例如,文件,编辑),则需要像上面一样更改操作名称或使用
QAction::setMenuRole(...)
这样:...
exitAction = QAction(QIcon('exit.png'), '&Exit', self)
print(exitAction.menuRole()) # It prints "1". QAction::TextHeuristicRole
exitAction.setMenuRole(QAction.NoRole)
...
请阅读以下内容,它将对您有帮助。
关于python - PyQt5中缺少menuBar,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39574105/