为什么没有菜单被添加?(Why doesn't menu get added?)

2019-09-20 09:15发布

我清楚地失去了一些东西; 为什么不将文件菜单中的这个小示例应用程序添加?

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

这应该打印“富”,但打印什么。

Answer 1:

乍一看,你的代码似乎完全正常的,它也只是预期在Windows或Linux的功能。 这里的问题是,在OSX的操作系统强制执行菜单上的标准接口。 而在其他操作系统上的菜单嵌套就在你的应用程序,并且您的应用程序拥有它......在OSX的操作系统拥有它。 因此,它显示在全局菜单区域。

话虽这么说,OSX被过滤掉一些保留关键字“退出”或“退出”。 这样做的原因是因为退出的功能是自动放置在你的应用程序菜单的标准。 当你运行它作为一个基本的python脚本,菜单将被称为“蟒”。 但如果你将其捆绑到一个应用程序,它会相应为您的捆绑应用程序命名。

这这里的链接 ,而不是一个确切的解释,确实提到了在OSX菜单中的差异。

对于固定的菜单的一个简单的例子,看看当你这样做会发生什么:

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

OSX不会过滤掉一个。 不过,我想它能够更好地按照本地标准,使所有的应用程序体验平台上是相同的。 你一定会包含“退出”菜单行动,你有现在的,所以如果在Linux或Windows上运行你的应用程序将是跨平台的,只是期待OSX将重新定位它。



Answer 2:

我已经遇到这个线程,因为我有一个类似的问题挣扎。 下面是我发现...

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

Window().show()

对于线

w = Window()
w.show()

如您在原始的代码了。 显然,在构造函数的返回类型导致链接是在python的问题?

我能够通过注释掉重现您编辑1 from __future__线。 否则,下面的代码工作(山狮10.8.3与酿造蟒蛇)如预期的OS X。 具体地讲,下面的代码把该OS X创建“巨蟒”的应用程序菜单下的“关于”行动,并创建包含以下简称“网站”采取行动“帮助”菜单。

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')如上述。



文章来源: Why doesn't menu get added?