我正在尝试将一个项添加到一个简单的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()
方法手动换出菜单栏。
上述代码段中的任何明显错误?
答案 0 :(得分:6)
我知道这个问题已经过时但是,由于我遇到了同样的问题,我发现因为我正在创建一个退出应用程序的操作并且此操作在OSX上保留到应用程序菜单,因此文件菜单没有出现。当我在同一菜单上创建一个新动作时,它变得可用。 这适用于其他操作系统使用相同的方法:
self.menubar = self.menuBar()
这是在QMainWindow对象中创建的。
希望这对任何人都有帮助!
答案 1 :(得分:4)
在Mac上使用PyQt时,系统会拦截某些包含“退出”或“退出”字样的命令,并将它们从菜单栏中删除,因为它们存在于其他地方。如果菜单栏标题没有项目,它将不会显示,使其看起来好像您没有修改菜单栏。
#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 menubars显示在系统菜单栏中,而不是像Windows或Linux机器上那样显示在窗口中。这导致我们采用Levi501和Swdev建议的另一种解决方案。那就是使用窗口中出现的非原生菜单,如下所示:
menubar = self.menuBar()
menubar.setNativeMenuBar(False)
作为使用Windows和Linux的人,这对我的项目来说更有意义。
我在此处找到了“退出”信息:http://python.6.x6.nabble.com/addAction-to-menubar-td1916296.html
答案 2 :(得分:3)
我没有在这台机器上安装PyQt来测试它,但我认为在Mac上QMainWindow.menuBar()
功能不会返回应用程序范围的菜单栏。
您可以尝试创建一个菜单栏,如:
menubar = QtGui.MenuBar()
我的基础是QMainWindow.menuBar()
函数的文档:
http://doc.qt.io/qt-4.8/qmainwindow.html#menuBar
您还可以在此页面上查看标有 QMenuBar on Mac OS X 的部分:
http://doc.qt.io/qt-4.8/qmenubar.html#details
希望有所帮助!
答案 3 :(得分:2)
正确。在MAC OS上我们需要像这样使用菜单栏:
self.menubar = QtGui.QMenuBar()
而不是这样:
self.menubar = QtGui.QMenuBar(MainWindow)
(没有MainWindow
参数)
我建议最好的解决方案是使用QTDesiner
构建UI布局,然后使用pyside-uic
工具转换为不同平台上的Python类。当我使用在MAC上在Windows上编译的UI布局类时,我遇到了这个问题。通过使用命令pyside-uic AppMain.ui -o ui_AppMain.pyp
在比较MAC和Windows之间的已编译UI布局类之后,唯一的区别是在Max OS X上创建了没有QMenuBar
参数的新MainWindow
对象。