2016-09-19 245 views
3

我一直在开发一个使用PyQt5的GUI,并希望包含一个菜单栏。但是,当我去编写此功能时,我的菜单不会出现。让我对如何在PyQt5中实现菜单栏的理解失去了兴趣,我在网上寻找了一个预先存在的例子。随着一些调整我制定了以下测试案例:在PyQt5中缺少menuBar

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布局)。我认为这会消除我的一些编程错误,但菜单栏仍然不会显示。有什么想法吗?

编辑:

进出口运行使用Python 3.5的代码(蟒蛇4.1)从Jupyter笔记本电脑中,4.1版。我也在使用运行os 10.1l的Macbook,PyQt 5.7和Qt版本5.7.0。

我已经意识到,如果点击应用程序窗口,然后再点击回窗口,菜单栏将变得响应 - 有效地不重点和聚焦应用程序。有了这些信息,我意识到我不是第一个注意到这个问题的人(见https://github.com/robotology/yarp/issues/457)。不幸的是,我仍然不确定如何解决这个问题。

+0

[OS X上的QMenuBar](http://doc.qt.io/qt-5/qmenubar.html#qmenubar-on-os-x)。 – ekhumoro

+0

@ekhumoro我不明白这与我在PyQt中的问题有何关系。 – user144153

+0

这几乎肯定是一个osx特有的问题。你的例子在Linux上运行良好(可能也在Windows上运行)。由于[菜单在osx上的工作方式似乎不同](http://doc.qt.io/qt-5/osx-issues.html#menu-bar),也许你应该正确地*拼出*你期望看到的内容,和你实际得到什么。也许一些截图会有所帮助。你也应该说明你正在使用的qt5/pyqt5的确切版本。 – ekhumoro

回答

3

这不是Qt和PyQt5错误。

我认为你的代码是zetcode pyqt5 menubar tutorial。我在Mac OS上遇到了完全相同的问题。

第一个解决方案是一个窍门。使用' &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只显示除了"Quit"上的菜单项:在'&Exit'开始这样插入空格苹果系统。实际上“退出”有TextHeuristicRole,因此覆盖了“应用程序”菜单中的“退出”行为。当你点击“Python”菜单中的“退出python”时,它不会退出,只需打印“退出触发”。

如果必须使用在其他菜单名称(例如文件,编辑),您需要更改的动作名称,如高于或使用QAction::setMenuRole(...)这样的:

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

请阅读以下内容,这将是帮你。

0

试试这个:的

menubar = QMenuBar() 
self.setMenuBar(menubar) 

代替menubar = self.menuBar()

+0

啊我没想到要找一套方法。这会让“Testmenu”显示在菜单栏中,但exitAction项目仍然丢失。不应该'fileMenu.addAction(exitAction)'填充菜单? – user144153

+0

是的,它应该填充菜单。至少在我的项目中我是这么做的。还有一些其他的错误......你保留线'fileMenu = menubar.addMenu('&Testmenu')'? –

+0

是的,我完好无损。清楚的是,当我运行代码时,菜单栏创建了一个名为'Testament'的菜单,但是当我点击它时没有任何反应。这几乎就像它的冻结,除了窗户本身(和我的机器上的其他所有东西)运行良好。 – user144153

0

您是否尝试过在以下链接tutorialspoint最简单的例子。

这是最简单的例子。

import sys 

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

class menudemo(QMainWindow): 
    def __init__(self, parent = None): 
     super(menudemo, self).__init__(parent) 

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

     save = QAction("Save",self) 
     save.setShortcut("Ctrl+S") 
     file.addAction(save) 

     edit = file.addMenu("Edit") 
     edit.addAction("copy") 
     edit.addAction("paste") 

     quit = QAction("Quit",self) 
     file.addAction(quit) 
     file.triggered[QAction].connect(self.processtrigger) 
     self.setWindowTitle("menu demo") 

    def processtrigger(self, q): 
     print(q.text()+" is triggered") 


def main(): 
    app = QApplication(sys.argv) 
    ex = menudemo() 
    ex.show() 
    sys.exit(app.exec_()) 

if __name__ == '__main__': 
    main() 
+0

这个例子完美地工作。我唯一的问题是它使用PyQt4而不是PyQt5。我改变了导入来使用PyQt5,并且在PyQt5.QtWidgets import *中包含了额外的一行'',认为这个例子仍然可以工作。 Unfornutatly这个例子不适用于PyQt5。我遇到了菜单栏会出现同样的问题,但点击它不会扩大菜单。任何想法,这个问题来自哪里? – user144153

+0

先生,你只需要改变进口,因为自PyQt5以来他们改变了一些路径。所以试试看.. [回答更新] – yurisnm

+0

我试过上面的例子时已经改变了导入以使用'PyQt5'。这个例子中的窗口和菜单栏会加载,但除非我不专心,然后将窗口对焦,菜单栏无响应。它接缝是特定于Mac OS X上的Qt或PyQt的问题 – user144153

0

如果您的程序运行在Ubuntu上,你会发现在屏幕的顶部菜单栏。

如果您想将菜单栏移动到窗口的标题栏,可以在“系统设置/外观/行为/显示窗口的菜单/在窗口的标题栏中”切换设置。