我在这里明显遗漏了一些东西;为什么文件菜单没有添加到这个小例子应用程序中?
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__
行,或<{1}}代替self.tr(str('foo'))
引用的字符串,则
编辑2:
self.tr('foo')
这应打印&#39; foo&#39;,但不打印任何内容。
答案 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')
。