Pregunta

Claramente estoy perdiendo algo aquí;¿por qué no en el menú Archivo se agregan en este pequeño ejemplo de la aplicación?

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

EDITAR:

Ok, parece que esto es en realidad una unicode problema.He aquí otro ejemplo de la aplicación:

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

Esta aplicación no tiene 'Archivo' o 'Salir' o 'Salir', pero obras si yo comente la from __future__ línea, o rodear las cadenas entre comillas como self.tr(str('foo')) en lugar de self.tr('foo')

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

Este debe imprimir 'foo', pero se imprime nada.

¿Fue útil?

Solución

A primera vista, su código parece perfectamente normal, y funciona igual de esperado en Windows o Linux. El problema aquí es que en OSX, el sistema operativo impone una interfaz estándar en el menú. Mientras que en otros sistemas operativos, el menú está anidado justo debajo de su aplicación, y su aplicación lo posee ... en OSX, el sistema operativo lo posee. Por lo tanto, se muestra en el área del menú global.

Dicho esto, OSX está filtrando algunas palabras clave reservadas como "Quit" o "SALIR". La razón de esto se debe a que la funcionalidad de salida es un estándar que se coloca automáticamente en el menú de su aplicación. Cuando lo ejecuta como un guión básico de Python, el menú se llamará "Python". Pero si lo envuelven en una aplicación, se nombrará en consecuencia para su aplicación en paquete.

este enlace aquí , aunque no es una explicación exacta, menciona la Diferencias para un menú en OSX.

Para un ejemplo rápido de arreglar su menú, consulte lo que sucede cuando hace:

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

OSX no se filtrará por ese. Pero supongo que es mejor seguir los estándares nativos que hacen que todas las experiencias de la aplicación sean iguales en la plataforma. Definitivamente incluiría la acción del menú "Salir" como lo tiene ahora, para que su aplicación sea multiplataforma si se ejecuta en Linux o Windows, y solo espera que OSX lo reubine por usted.

Otros consejos

Me he encontrado con este hilo porque estoy luchando con un problema similar.He aquí lo que he encontrado...

Acerca de la EDICIÓN 2:El código imprimirá correctamente 'foo' si sustituye la línea

Window().show()

para las líneas

w = Window()
w.show()

como usted ha tenido en su código original.Al parecer, el tipo de retorno en el constructor de encadenamiento de causas de un problema en python?

Yo era capaz de reproducir su EDICIÓN de 1 comentando la from __future__ de la línea.De lo contrario, el siguiente código funciona como se esperaba en OS X Mountain Lion 10.8.3 elaborada con python).Específicamente, el código siguiente se pone el "Acerca de" en el marco de la "Python" menú de la aplicación que OS X crea, y también crea un menú de "Ayuda" que contiene el "sitio Web" de la acción.

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

Debo llamar la atención sobre un punto importante que este hilo me ayudó a descubrir.He visto un montón de consejos para OS X que indica que se debe crear menu_bar = QMenuBar() independientemente de QMainWindow y, a continuación, enlazar con self.setMenuBar(menu_bar) donde self representa QMainWindow.Esto, de hecho, no funciona para mí.En su lugar, lo que hizo el trabajo, es el acaparamiento de la barra de menú de referencia directamente desde el QMainWindow propia clase.Por ejemplo, y al igual que la anterior, cuando la adición de un menú, utilice self.help_menu = self.menuBar().addMenu('Help') como se indicó anteriormente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top