为什么菜单没有添加?

时间:2012-07-28 16:14:00

标签: qt pyqt pyside qmainwindow

我在这里明显遗漏了一些东西;为什么文件菜单没有添加到这个小例子应用程序中?

import sys
from PySide.QtGui import *

class Window(QMainWindow):
    def __init__(self):
        super(Window, self).__init__()
        self.setWindowTitle('Test')
        layout = QHBoxLayout()
        self.widget = QWidget()
        self.widget.setLayout(layout)
        self.setCentralWidget(self.widget)
        self.exitAction = QAction('Exit', self, shortcut=QKeySequence.Quit, triggered=self.close)
        self.fileMenu = self.menuBar().addMenu('File')
        self.fileMenu.addAction(self.exitAction)

app = QApplication(sys.argv)
w = Window()
w.show()
sys.exit(app.exec_())

编辑:

好吧,看起来这实际上是一个unicode问题。 这是另一个示例应用:

from __future__ import unicode_literals, print_function, division
import sys
from PySide.QtCore import *
from PySide.QtGui import *

class Window(QMainWindow):
    def __init__(self):
        super(Window, self).__init__()
        self.dummyAction = QAction(self.tr('dummy'), self, triggered=self.dummy)
        self.gameMenu = self.menuBar().addMenu(self.tr('ddddummy'))
        print (self.tr('dummy'))
        self.gameMenu.addAction(self.dummyAction)
        layout = QHBoxLayout()
        self.widget = QWidget()
        self.widget.setLayout(layout)
        self.setCentralWidget(self.widget)

    def dummy(self):
        pass

locale = QLocale.system().name()
qtTranslator = QTranslator()
app = QApplication(sys.argv)
if qtTranslator.load('qt_' + locale, ':/'):
    app.installTranslator(qtTranslator)
w = Window()
w.show()
sys.exit(app.exec_())

此应用没有&#39;文件&#39;或者&#39;退出&#39;或者&#39;退出&#39; - 但如果我注释掉from __future__行,或<{1}}代替self.tr(str('foo'))引用的字符串,则

编辑2:

self.tr('foo')

这应打印&#39; foo&#39;,但不打印任何内容。

2 个答案:

答案 0 :(得分:6)

乍一看,您的代码看起来非常正常,并且它在Windows或Linux上运行正常。这里的问题是在OSX上,操作系统在菜单上强制执行标准接口。而在其他操作系统上,菜单嵌套在您的应用程序下,并且您的应用程序拥有它...在OSX上,操作系统拥有它。因此它显示在全局菜单区域中。

话虽如此,OSX正在过滤掉一些保留的关键字,如“退出”或“退出”。原因是退出功能是自动放置在“应用程序”菜单中的标准。当您将其作为基本python脚本运行时,该菜单将被称为“Python”。但如果您将其捆绑到应用程序中,则会根据您的捆绑应用程序对其进行相应命名。

这个link here虽然不是一个确切的解释,但确实提到了OSX菜单的不同之处。

有关修复菜单的快速示例,请查看执行操作时会发生什么:

    self.exitAction = QAction('Kwit', self)

OSX不会过滤掉那个。但我认为最好遵循原生标准,使平台上的所有应用体验相同。您现在肯定会包含“退出”菜单操作,因此如果在Linux或Windows上运行,您的应用程序将是跨平台的,并期望OSX将为您重新定位。

答案 1 :(得分:0)

我遇到过这个帖子,因为我正在努力解决类似的问题。这是我发现的......

关于你的编辑2: 如果替换

行,您的代码将正确打印'foo'
Window().show()

为行

w = Window()
w.show()
正如您在原始代码中所做的那样。显然,构造函数上的返回类型会导致链接成为python中的一个问题吗?

我能够通过评论from __future__行重现您的编辑1。否则,下面的代码在OS X(Mountain Lion 10.8.3 with brewed python)中按预期工作。具体来说,以下代码将“关于”操作置于OS X创建的“Python”应用程序菜单下,并创建包含“网站”操作的“帮助”菜单。

import sys
from PySide.QtGui import QApplication,QMainWindow, QWidget, QAction

class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.create_menus()
        self.create_main_frame()

    def create_menus(self):
        self.aboutAction = QAction('About', self, triggered=self.on_about)
        self.websiteAction = QAction('Website', self, triggered=self.on_website)
        self.help_menu = self.menuBar().addMenu('Help')
        self.help_menu.addAction(self.aboutAction)
        self.help_menu.addAction(self.websiteAction)

    def create_main_frame(self):
        self.mainWidget = QWidget()
        self.setCentralWidget(self.mainWidget)

    def on_website(self):
        pass

    def on_about(self):
        pass

app = QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())

我应该提请注意这个帖子帮助我发现的一个重点。我已经看到很多关于OS X的建议,表明你应该独立于menu_bar = QMenuBar()创建QMainWindow,然后与self.setMenuBar(menu_bar)绑定self代表QMainWindow。事实上,这对我没有用。相反,有效的方法是直接从QMainWindow类本身获取菜单栏引用。例如,如上所述,添加菜单时,请使用上面的self.help_menu = self.menuBar().addMenu('Help')