أحداث تحديث واجهة المستخدم والخمول لـ wx في PyQt

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

  •  05-07-2019
  •  | 
  •  

سؤال

يحتوي wx (و wxPython) على حدثين أفتقدهما في PyQt:

  • EVT_IDLE التي يتم إرسالها إلى الإطار.يمكن استخدامه لتحديث الأدوات المختلفة وفقًا لحالة التطبيق
  • EVT_UPDATE_UI يتم إرسالها إلى عنصر واجهة المستخدم عندما يتعين إعادة طلائها وتحديثها، حتى أتمكن من حساب حالتها في المعالج

الآن، يبدو أن PyQt لا يمتلك هذه العناصر، ويقترح كتاب PyQt كتابة updateUi الطريقة واستدعاءها يدويًا.وانتهى بي الأمر باستدعاءه من مؤقت مرة واحدة كل 0.1 ثانية، وذلك لتجنب العديد من الاستدعاءات اليدوية من الطرق التي قد تعمل على تحديث واجهة المستخدم الرسومية.هل فاتني شيء؟هل هناك طريقة أفضل لتحقيق ذلك؟


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

طلبي يحتوي على حالات:

  1. قبل فتح الملف (في هذه الحالة يظهر شريط الحالة شيئًا خاصًا ويتم تعطيل زر البدء)
  2. تم فتح الملف ولم تبدأ المعالجة:يتم تمكين زر البداية، ويظهر شريط الحالة شيئا آخر
  3. جاري المعالجة:يظهر زر البداية الآن "إيقاف"، ويعرض شريط الحالة التقدم

في Wx، سيكون لدي حدث تحديث واجهة المستخدم للزر الذي يتعامل مع حالته:النص الموجود عليه، وما إذا كان ممكّنًا، اعتمادًا على حالة التطبيق.الشيء نفسه بالنسبة لشريط الحالة (أو سأستخدم EVT_IDLE لذلك).

في Qt، لا بد لي من تحديث الزر بعدة طرق قد تؤثر على الحالة، أو فقط قم بإنشاء طريقة update_ui واستدعائها بشكل دوري في مؤقت.ما هي الطريقة الأكثر "QT" -ish؟

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

المحلول

يبدو أن استخدام EVT_UPDATE_UI في wxWidgets يسلط الضوء على أحد الاختلافات الأساسية في الطريقة التي يتوقع بها wxWidgets وQt أن يتعامل المطورون مع الأحداث في التعليمات البرمجية الخاصة بهم.

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

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

سيتعين عليك أن تقول المزيد عما تفعله لتوضيح سبب حاجتك إلى ما يعادل هذا الحدث في كيو تي.

نصائح أخرى

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

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

http://doc.trolltech.com/4.5/signalsandslots.html#signals

نوع الاتصال هو معلمة اختيارية لوظيفة الاتصال ():http://doc.trolltech.com/4.5/qobject.html#connect , http://doc.trolltech.com/4.5/qt.html#ConnectionType-enum

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

بشكل عام، الطريقة الأكثر Qt-ish هي تحديث الزر/شريط الأدوات حسب الضرورة في أي وظائف تتطلب التحديث، أو دمج بعض الوظائف واستدعاء تلك الوظيفة مباشرة عندما يحتاجها البرنامج (مثل وظيفة updateUi).

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

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

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