سؤال

آسف على سؤال المبتدئين ... ما هي أسهل طريقة لتحديد الإجراءات ، والتي يتم تنفيذها عند حدوث Mousepressevent أو MousereleAseevent؟

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

شكرا لمساعدتك.

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

المحلول

هذا الموضوع في منتدى مركز QT يصف جيدًا ماهية خياراتك. ببساطة:

  1. افعل ما تفعله (أي الفئات الفرعية وإعادة التنفيذ)

  2. العمل مع مرشح الحدث كما هو موضح في الخيط وربطه.

نصائح أخرى

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

إذا كنت ترغب حقًا في توصيل الأحداث بالفتحات ، فيمكنك إجراء تنفيذ الفئة الفرعية الخاصة بك mousePressEvent(), ، على سبيل المثال ، ببساطة emit mousePressSignal(). بالطبع ، ستحتاج أيضًا إلى الإعلان mousePressSignal() في ال signals قسم من رأس الفئة الفرعية.

لا أستطيع أن أرى أي مشكلة في تجاوز QGraphicsView::mousePressEvent و QGraphisView::mouseReleaseEvent. بالكامل QGraphicsView/QGraphicsScene/QGraphicsItem تم بناء مفهوم التعامل مع الأحداث حول وظائف التعامل مع الأحداث الافتراضية.

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

من سؤالك ،

هل هناك أي طريقة لحل هذه المشكلة دون الحاجة إلى تحديد فصل جديد؟

الجواب هو لا. لا يمكنك.

يجب أن ترث من الفصل الذي تريد التعامل مع الأحداث.

هل يمكنني توصيل الأحداث بفتحات بطريقة ما؟

لا. لا يمكنك توصيل الأحداث بالفتحات ولكن يمكن أن تكون الإشارات فقط متصلة بالفتحات.

الطريقة التي تفعله الآن هي طريقة القيام بها.

يمكنك استخدام مرشحات الأحداث: انظر http://doc.qt.nokia.com/4.6/qobject.html#eventfilterأو ، لعناصر الرسومات على وجه الخصوص ، http://doc.qt.nokia.com/4.6/qgraphicsitem.html#sceneeventfilter

لاحظ أنه بالنسبة لهذا الأخير ، تتغير بعض الأحداث: يصبح QMouseevent QGraphicsScenemousevent على سبيل المثال ، لذلك تأكد من تصفية النوع الصحيح.

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

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