PyQt MenuBar Mac OSX 雪豹
Posted
技术标签:
【中文标题】PyQt MenuBar Mac OSX 雪豹【英文标题】:PyQt MenuBar Mac OSX Snow Leopard 【发布时间】:2010-02-14 02:07:35 【问题描述】:我正在尝试将一个项目添加到一个简单的 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()
方法手动换出菜单栏。
上面的 sn-p 有什么明显的错误吗?
【问题讨论】:
【参考方案1】:我知道这个问题很老了,但是由于我遇到了同样的问题,我发现因为我正在创建一个退出应用程序的操作,并且此操作在 OSX 上保留给应用程序菜单,所以文件菜单没有出现。当我在同一个菜单上创建一个新操作时,它变得可用。 这通过对其他操作系统使用相同的方法来工作:
self.menubar = self.menuBar()
这是在 QMainWindow 对象中创建的。
希望这对任何人都有帮助!
【讨论】:
很高兴知道它很有用@ChrisCalloway。 谢谢!重要的部分不是关于self.menuBar()
代码,而是我正在测试添加退出操作的事实。添加另一个菜单,显示这个【参考方案2】:
在 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 菜单栏显示在系统菜单栏中,而不是像 Windows 或 Linux 机器上的窗口中。这将我们引向另一个解决方案,正如 Levi501 和 Swdev 所建议的那样。那就是使用出现在窗口中的非本地菜单,如下所示:
menubar = self.menuBar()
menubar.setNativeMenuBar(False)
作为一个经常使用 windows 和 linux 的人,这对我的项目来说更有意义。
我在这里找到了“退出”信息:http://python.6.x6.nabble.com/addAction-to-menubar-td1916296.html
【讨论】:
哇,其他都没有用,你是我的救星!这应该是公认的答案。谢谢老兄。【参考方案3】:我没有在这台机器上安装 PyQt 来测试这一点,但我认为在 Mac 上 QMainWindow.menuBar()
函数不会返回应用程序范围的菜单栏。
您可以尝试创建如下菜单栏:
menubar = QtGui.MenuBar()
我将这里的 QMainWindow.menuBar()
函数的文档作为基础:
http://doc.qt.io/qt-4.8/qmainwindow.html#menuBar
您还可以查看此页面上标记为 Mac OS X 上的 QMenuBar 的部分:
http://doc.qt.io/qt-4.8/qmenubar.html#details
希望有帮助!
【讨论】:
另一个选项,将菜单栏放在窗口本身是 if sys.platform=="darwin": QtGui.qt_mac_set_native_menubar(False) 我使用 brew 安装 PyQt4,使用此代码仍然不会在统一模式下显示我的菜单栏。我只能通过设置self.menuBar.setNativeMenuBar(False)
将菜单栏显示在应用程序主窗口内。有什么建议吗?【参考方案4】:
正确。在 MAC OS 上,我们需要像这样使用菜单栏:
self.menubar = QtGui.QMenuBar()
不是这样的:
self.menubar = QtGui.QMenuBar(MainWindow)
(不带MainWindow
参数)
我建议最好的解决方案是使用 QTDesiner
构建 UI 布局,然后使用 pyside-uic
工具在不同平台上转换为 Python 类。当我在 MAC 中使用在 Windows 上编译的 UI 布局类时,我遇到了这个问题。只需在 MAC 上使用命令pyside-uic AppMain.ui -o ui_AppMain.pyp
重新编译 UI 布局 XML 即可解决此问题
在我比较 MAC 和 Windows 之间编译的 UI 布局类之后,唯一的区别是在 Max OS X 上,新的 QMenuBar
对象是在没有 MainWindow
参数的情况下创建的。
【讨论】:
以上是关于PyQt MenuBar Mac OSX 雪豹的主要内容,如果未能解决你的问题,请参考以下文章
Mac OS X 10.6(雪豹)上的 Qt 4.4 视觉伪影是不是有解决方法