4

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

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_())

这个应用程序没有“文件”或“退出”或“退出”——但如果我注释掉该行,或者将引用的字符串包围起来,它就可以工作,而不是from __future__self.tr(str('foo'))self.tr('foo')

编辑2:

from __future__ import unicode_literals
import sys
from PySide.QtGui import *

class Window(QMainWindow):
    def __init__(self):
        super(Window, self).__init__()
        print self.tr('foo')

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

这应该打印'foo',但什么也不打印。

4

2 回答 2

6

乍一看,您的代码似乎完全正常,并且在 windows 或 linux 上的功能与预期的一样。这里的问题是,在 OSX 上,操作系统在菜单上强制执行标准界面。而在其他操作系统上,菜单嵌套在您的应用程序下,您的应用程序拥有它......在 OSX 上,操作系统拥有它。因此它显示在全局菜单区域中。

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

此处的此链接虽然不是确切的解释,但确实提到了 OSX 上菜单的差异。

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

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

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

于 2012-07-28T18:27:45.657 回答
0

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

关于您的编辑 2:如果您替换该行,您的代码将正确打印“foo”

Window().show()

对于线

w = Window()
w.show()

正如您在原始代码中所做的那样。显然构造函数的返回类型导致链接成为python中的一个问题?

通过注释掉该from __future__行,我能够重现您的 EDIT 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)whereself代表绑定QMainWindow。事实上,这对我不起作用。相反,起作用的是直接从 QMainWindow 类本身获取菜单栏引用。例如,和上面一样,在添加菜单时,使用self.help_menu = self.menuBar().addMenu('Help')如上。

于 2013-05-19T10:24:15.953 回答