6

我正在尝试将一个项目添加到一个简单的 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

4 回答 4

6

我知道这个问题很老,但是由于我遇到了同样的问题,我发现因为我正在创建一个退出应用程序的操作,并且这个操作在 OSX 上保留给应用程序菜单,所以文件菜单没有出现。当我在同一个菜单上创建一个新操作时,它变得可用。这通过对其他操作系统使用相同的方法来工作:

self.menubar = self.menuBar()

这是在 QMainWindow 对象中创建的。

希望这对任何人都有帮助!

于 2014-02-20T23:51:55.373 回答
5

在 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

于 2015-06-24T13:50:26.217 回答
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

希望有帮助!

于 2010-02-14T02:52:52.030 回答
2

正确的。在 MAC OS 上,我们需要像这样使用菜单栏:

self.menubar = QtGui.QMenuBar() 

而不是这样:

self.menubar = QtGui.QMenuBar(MainWindow) 

(不带MainWindow参数)

我建议最好的解决方案是使用QTDesiner构建 UI 布局,然后使用pyside-uic工具在不同平台上转换为 Python 类。当我在 MAC 中使用在 Windows 上编译的 UI 布局类时,我遇到了这个问题。只需使用命令在 MAC 上重新编译 UI 布局 XML 即可解决此问题pyside-uic AppMain.ui -o ui_AppMain.pyp

在我比较 MAC 和 Windows 之间编译的 UI 布局类之后,唯一的区别是在 Max OS X 上,新QMenuBar对象是在没有MainWindow参数的情况下创建的。

于 2012-10-02T04:43:33.443 回答