Pyqt إرسال المعلمة إلى فتحة عند الاتصال إشارة

StackOverflow https://stackoverflow.com/questions/940555

  •  06-09-2019
  •  | 
  •  

سؤال

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

QtCore.QObject.connect(menuAction, 'triggered()', menuClickedFunc)

أعلم أن بعض الأحداث ترجع قيمة، ولكنها تسبب () لا. إذن كيف يحدث هذا يحدث؟ هل يجب علي صنع إشارة خاصة بي؟

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

المحلول

إستخدم lambda

هنا مثال من كتاب PYQT:

self.connect(button3, SIGNAL("clicked()"),
    lambda who="Three": self.anyButton(who))

بالمناسبة، يمكنك أيضا استخدام functools.partial, ، لكنني أجد lambda طريقة أبسط وأكثر وضوحا.

نصائح أخرى

كما ذكر سلفا هنا يمكنك استخدام وظيفة Lambda لتمرير الوسائط الإضافية إلى الطريقة التي تريد تنفيذها.

في هذا المثال، يمكنك تمرير سلسلة OBJ إلى الوظيفة AddControl () التي تم استدعاءها عند الضغط على الزر.

# Create the build button with its caption
self.build_button = QPushButton('&Build Greeting', self)
# Connect the button's clicked signal to AddControl
self.build_button.clicked.connect(lambda: self.AddControl('fooData'))
def AddControl(self, name):
    print name

مصدر: Snip2Code - باستخدام وظيفة Lambda لتمرير حجة إضافية في Pyqt4

استخدام functools.partial.

وإلا فستجد أنه لا يمكنك تمرير الوسائط ديناميكيا عند تشغيل البرنامج النصي، إذا كنت تستخدم Lambda.

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

إذا كنت لا ترغب في القيام بذلك بهذه الطريقة، يمكنك استخدام QOBJECT :: المرسل () وظيفة للحصول على مؤشر إلى المرسل (أي: الكائن الذي ينبعث الإشارة). أود أن أسمع أكثر قليلا حول ما تحاول إنجازه.

أود أيضا أن أضيف أنه يمكنك استخدام sender الطريقة إذا كنت بحاجة فقط لمعرفة ما أرسلت القطعة الإشارة. علي سبيل المثال:

def menuClickedFunc(self):
    # The sender object:
    sender = self.sender()
    # The sender object's name:
    senderName = sender.objectName()
    print senderName
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top