سؤال

من الواضح أنني أفتقد شيئًا ما هنا؛لماذا لا تتم إضافة قائمة "ملف" في هذا التطبيق البسيط؟

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"، لكنه لا يطبع شيئًا.

هل كانت مفيدة؟

المحلول

للوهلة الأولى، يبدو الكود الخاص بك طبيعيًا تمامًا، ويعمل تمامًا كما هو متوقع على نظام التشغيل Windows أو Linux.تكمن المشكلة هنا في أن نظام التشغيل في OSX يفرض واجهة قياسية في القائمة.بينما في أنظمة التشغيل الأخرى، تكون القائمة متداخلة أسفل تطبيقك مباشرةً، ويمتلكها تطبيقك... أما في OSX، فيملكها نظام التشغيل.ومن ثم يتم عرضه في منطقة القائمة العالمية.

ومع ذلك، يقوم OSX بتصفية بعض الكلمات الرئيسية المحجوزة مثل "إنهاء" أو "خروج".والسبب في ذلك هو أن وظيفة الإقلاع عن التدخين هي معيار يتم وضعه تلقائيًا في قائمة التطبيق لديك.عند تشغيله كبرنامج نصي أساسي لبايثون، ستسمى القائمة "بايثون".ولكن إذا قمت بتجميعه في تطبيق، فسيتم تسميته وفقًا لتطبيقك المجمع.

هذا الرابط هنا, ، على الرغم من أنه ليس شرحًا دقيقًا، إلا أنه يذكر الاختلافات في القائمة على OSX.

للحصول على مثال سريع لإصلاح القائمة، راجع ما يحدث عندما تفعل ذلك:

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

لن يقوم OSX بتصفية ذلك.لكنني أعتقد أنه من الأفضل اتباع المعايير الأصلية التي تجعل جميع تجارب التطبيقات متماثلة على النظام الأساسي.من المؤكد أنك ستقوم بتضمين إجراء القائمة "إنهاء" كما هو الحال الآن، بحيث يكون تطبيقك مشتركًا بين الأنظمة الأساسية إذا تم تشغيله على نظام التشغيل Linux أو Windows وتوقع فقط أن يقوم OSX بنقله لك.

نصائح أخرى

لقد جئت عبر هذا الموضوع لأنني أعاني من مشكلة مماثلة.إليكم ما وجدته...

حول التعديل 2:سيطبع الكود الخاص بك "foo" بشكل صحيح إذا قمت باستبدال السطر

Window().show()

للخطوط

w = Window()
w.show()

كما كان لديك في التعليمات البرمجية الأصلية الخاصة بك.من الواضح أن نوع الإرجاع في المنشئ يتسبب في أن يكون التسلسل مشكلة في بيثون؟

لقد تمكنت من إعادة إنتاج التعديل 1 الخاص بك عن طريق التعليق على from __future__ خط.بخلاف ذلك، فإن الكود أدناه يعمل كما هو متوقع في OS X (Mountain Lion 10.8.3 مع Breed python).على وجه التحديد، تضع التعليمة البرمجية التالية الإجراء "حول" ضمن قائمة تطبيق "Python" التي ينشئها 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') على النحو الوارد أعلاه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top