【问题标题】:Why doesn't menu get added?为什么不添加菜单?
【发布时间】:2012-07-27 00:09:35
【问题描述】:

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

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__ 行,或将 @987654324 等带引号的字符串括起来,它可以工作 @而不是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”,但什么也不打印。

【问题讨论】:

  • 实际上,这对我在 OSX 上也不起作用。还不知道为什么。看起来真的很奇怪。但它在 linux 上运行良好
  • 你有没有找到让它工作的方法?我也有同样的问题。

标签: qt pyqt pyside qmainwindow


【解决方案1】:

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

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

link here 虽然不是一个准确的解释,但确实提到了 OSX 上菜单的差异。

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

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

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

【讨论】:

  • 不错的尝试,但似乎我遇到的问题实际上有所不同 - 请参阅编辑。
  • 嗯,它在 ubuntu linux 上工作得很好,但在 osx 上却没有......只有在这个问题被换掉后才工作。我无法重现您的 unicode 问题,所以我不知道。可能是特定于 qt/pyside 或您正在使用的 python interp 的版本。
  • 这对我有用,尽管我遇到了第二个问题,即使用 raise_(​​) 事件时工具栏没有改变。我必须点击我的应用程序,然后重新打开它才能更改栏并查看“kwit”。
【解决方案2】:

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

关于您的编辑 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 的建议,这些建议表明您应该独立于 QMainWindow 创建 menu_bar = QMenuBar(),然后与 self.setMenuBar(menu_bar) 绑定,其中 self 代表 QMainWindow。事实上,这对我不起作用。相反,起作用的是直接从 QMainWindow 类本身获取菜单栏引用。例如,和上面一样,当添加菜单时,使用上面的self.help_menu = self.menuBar().addMenu('Help')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    • 2011-07-22
    • 1970-01-01
    • 2014-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多