问题描述
我试图将一个项目添加到一个简单的PyQt示例的应用程序菜单栏中。 但是,以下代码似乎根本没有改变菜单栏。 菜单中唯一的项目是“ Python”。 下面是大部分代码,减去导入和实例化。
class MainWindow(QtGui.QMainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
self.resize(250, 150)
self.setWindowTitle('menubar')
self.modal = False
exit = QtGui.QAction( QtGui.QIcon('images/app_icon.png'), 'Exit', self )
exit.setShortcut('Ctrl+Q')
exit.setStatusTip('Exit application')
self.connect(exit, QtCore.SIGNAL('triggered()'), QtCore.SLOT('close()'))
menubar = self.menuBar()
file = menubar.addMenu('File')
file.addAction(exit)
我也尝试过创建新的QMenuBar
并使用setMenuBar()
方法手动换出菜单栏。
以上代码段中是否存在明显错误?
1楼
我知道这个问题很旧,但是由于遇到同样的问题,我发现由于我正在创建一个退出应用程序的操作,并且此操作在OSX上保留给了Application菜单,因此File菜单没有出现。 当我在同一菜单上创建新动作时,该动作可用。 这通过对其他操作系统使用相同的方法来实现:
self.menubar = self.menuBar()
这是在QMainWindow对象内创建的。
希望这对任何人有帮助!
2楼
在Mac上使用PyQt时,系统会拦截某些包含单词“ Quit”或“ Exit”的命令,并将它们从菜单栏中删除,因为它们存在于其他位置。 如果菜单栏标题没有项目,则不会显示它,使其看起来好像您尚未修改菜单栏。
#exit = QtGui.QAction( 'Exit', self ) #this fails on my system
exit = QtGui.QAction( 'SomethingElse', self ) #this displays on my system
menubar = self.menuBar()
fileMenu = menubar.addMenu('&File')
fileMenu.addAction(exit)
另外,调用raise_()不会更改Mac上的菜单栏。 如果我使用raise_(),则必须手动选择窗口(通过单击其他位置然后重新单击),以获取正确的菜单栏以显示给我的pyqt应用程序。
还要记住,mac菜单栏显示在系统菜单栏中,而不是在Windows或Linux计算机上的窗口中。 正如Levi501和Swdev所建议的那样,这引出了另一种解决方案。 那就是使用出现在窗口中的非本地菜单,如下所示:
menubar = self.menuBar()
menubar.setNativeMenuBar(False)
作为大量使用Windows和Linux的人,这对我的项目来说意义更大。
我在这里找到“退出”信息: :
3楼
我没有在此计算机上安装PyQt进行测试,但我认为在Mac上, QMainWindow.menuBar()
函数不会返回应用程序范围的菜单栏。
您可以尝试创建菜单栏,例如:
menubar = QtGui.MenuBar()
我将其基于QMainWindow.menuBar()
函数的文档放在这里:
您也可以在此页面上签出Mac OS X上标有QMenuBar的部分:
希望有帮助!
4楼
正确。 在MAC OS上,我们需要使用如下菜单栏:
self.menubar = QtGui.QMenuBar()
而且不是这样的:
self.menubar = QtGui.QMenuBar(MainWindow)
(不带MainWindow
参数)
我建议最好的解决方案是使用QTDesiner
构建UI布局,然后使用pyside-uic
工具转换为不同平台上的Python类。
当我使用Windows在MAC中编译的UI布局类时,出现了此问题。
通过使用pyside-uic AppMain.ui -o ui_AppMain.pyp
命令在MAC上重新编译UI布局XML即可解决此问题
在比较了MAC和Windows之间的已编译UI布局类之后,唯一的区别是在Max OS X上创建了没有MainWindow
参数的新QMenuBar
对象。