سؤال

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

لأن هذا النموذج قد تكون غيرت من خارج تحكم (قد يكون هناك وحدات التحكم الأخرى باستخدام نفس النموذج ، التراجع عن العمليات الخ) ، تحكم يستمع إلى تغييرات على النموذج.وحدة تحكم أيضا يستمع إلى الأحداث على القطعة W والتحديثات العقار X وفقا لذلك.

الآن يحدث ما يلي:

  1. القيمة في W تغيير
  2. الحدث تم إنشاء معالج في تحكم يتم استدعاء
  3. على تحكم يحدد قيمة جديدة X في نموذج
  4. على نموذج تنبعث الأحداث لأنه تم تغيير
  5. على تحكم يتلقى تغيير الحدث من نموذج
  6. على تحكم يحصل على قيمة X ويحدد ذلك في القطعة
  7. غوتو 1.

هناك العديد من الحلول الممكنة لذلك:

  1. تعديل المراقب لوضع العلم عند نموذج تحديث و لا تتفاعل مع أي أحداث من هذا النموذج إذا كان هذا العلم هو مجموعة.
  2. قطع تحكم مؤقتا (أو قل نموذج عدم إرسال أي الأحداث لبعض الوقت)
  3. تجميد أي تحديثات من القطعة

في الماضي, وعادة ما ذهبت للخيار 1., لأن أبسط شيء.فقد عيب التبعثر الفصول الدراسية مع الأعلام ، ولكن أساليب أخرى لها سلبياتها أيضا.

فقط للعلم أنا لدي هذه المشكلة مع عدة أدوات واجهة المستخدم الرسومية ، بما في ذلك GTK+, Qt سبحانه وتعالى, لذلك اعتقد انها جميلة أدوات-الملحد.

أي أفضل الممارسات ؟ أو هو العمارة يمكنني استخدام ببساطة خطأ ؟

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

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

المحلول

عادة يجب أن تستجيب الأحداث المدخلات في القطعة و عدم تغيير الأحداث.هذا يمنع هذا النوع من حلقة من occuring.

  1. المستخدم إدخال تغييرات في القطعة
  2. القطعة تنبعث تغيير الحدث (انتقل به / أدخل النقر / ماوس إجازة ، إلخ.)
  3. يستجيب وحدة تحكم ، يترجم إلى تغيير في نموذج
  4. نموذج تنبعث الحدث
  5. تحكم يستجيب للتغيرات في قيمة القطعة
  6. تغيير قيمة الحدث المنبعثة ، ولكن لم تسمع من قبل المراقب

نصائح أخرى

معيار QT طريقة التعامل مع هذا أيضا المقترحة في البرنامج التعليمي مفيد جدا هو جعل تغيير القيمة في وحدة تحكم إلا إذا كانت قيمة جديدة مختلفة عن القيمة الحالية.
هذا هو الطريق إشارات لها دلالات valueChanged()

انظر هذا البرنامج التعليمي

الأعلام تشير إلى updaing العمل.يمكنك التفاف عليها في أساليب مثل BeginUpdate و EndUpdate.

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