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:雪豹内置支持读写NTFS卷

NSPopover 和雪豹

Mac OS X 10.6(雪豹)上的 Qt 4.4 视觉伪影是不是有解决方法

雪豹:致命错误:调用未定义函数 mysql_connect()

mac osx lion系统镜像怎么安装

雪豹系统(黑苹果)下virtualbox 虚拟机 设置网卡桥接方式 不成功!。求解!!!