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 は「Quit」や「Exit」などの予約済みキーワードを除外しています。これは、終了機能がアプリケーション メニューに自動的に配置される標準であるためです。基本的な python スクリプトとして実行すると、メニューは「Python」と呼ばれます。ただし、アプリにバンドルする場合は、バンドルされたアプリに応じて名前が付けられます。

このリンクはこちら、正確な説明ではありませんが、OSX のメニューの違いについて言及しています。

メニューを修正する簡単な例については、実行するとどうなるかを参照してください。

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

OSX はそれを除外しません。しかし、プラットフォーム上ですべてのアプリのエクスペリエンスを同じにするネイティブ標準に従う方がよいと思います。Linux または Windows で実行されている場合にアプリがクロスプラットフォームになり、OSX がそれを再配置することを期待できるように、現在の「Quit」メニュー アクションを確実に含めます。

于 2012-07-28T18:27:45.657 に答える
0

私は同様の問題に苦しんでいるので、このスレッドに出くわしました。これが私が見つけたものです...

EDIT 2について:行を置き換えると、コードは「foo」を正しく出力します

Window().show()

ラインのために

w = Window()
w.show()

元のコードと同じように。どうやらコンストラクターの戻り値の型が原因で、Python でチェーンが問題になるのでしょうか?

行をコメントアウトすることで、EDIT 1を再現できましたfrom __future__。それ以外の場合、以下のコードは OS X (brewed python を使用した Mountain Lion 10.8.3) で期待どおりに機能します。具体的には、次のコードは、OS X が作成する「Python」アプリケーション メニューの下に「About」アクションを配置し、「Website」アクションを含む「Help」メニューも作成します。

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

このスレッドが発見に役立った重要な点に注意を向ける必要があります。menu_bar = QMenuBar()OS X については、とは独立して作成しQMainWindow、次にとバインドする必要self.setMenuBar(menu_bar)があることを示す多くのアドバイスを見てきましselfQMainWindow。実際、これは私にはうまくいきませんでした。代わりに、QMainWindow クラス自体からメニュー バーの参照を直接取得することでうまくいきました。たとえば、上記のように、メニューを追加する場合は、self.help_menu = self.menuBar().addMenu('Help')上記のように使用します。

于 2013-05-19T10:24:15.953 に答える