PyQt 菜单栏 Mac OSX 雪豹
我正在尝试在一个简单的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()
方法手动替换菜单栏。
上面的代码片段有什么明显的错误吗?
4 个回答
我知道这个问题已经很久了,但因为我也遇到了同样的问题,所以想分享一下我的发现。原来我创建了一个退出应用程序的操作,而这个操作在OSX系统中是留给应用菜单用的,所以文件菜单就没有显示出来。当我在同一个菜单上创建了一个新的操作后,文件菜单就出现了。
我用同样的方法在其他操作系统上也成功了:
self.menubar = self.menuBar()
这个是在一个QMainWindow对象里面创建的。
希望这对大家有帮助!
在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的人,这对我的项目来说更有意义。
我在这里找到了关于“Exit”的信息:http://python.6.x6.nabble.com/addAction-to-menubar-td1916296.html
我这台电脑上没有安装PyQt,所以没法测试这个,不过我觉得在Mac上,QMainWindow.menuBar()
这个函数不会返回整个应用的菜单栏。
你可以试着创建一个菜单栏,像这样:
menubar = QtGui.MenuBar()
我这个说法是根据QMainWindow.menuBar()
函数的文档来的,具体可以查看这里:
http://doc.qt.io/qt-4.8/qmainwindow.html#menuBar
你也可以看看这个页面上标注为QMenuBar在Mac OS X上的使用的部分:
http://doc.qt.io/qt-4.8/qmenubar.html#details
希望这些信息对你有帮助!