سؤال

لقد تم تنشيط ذلك لأكثر من يومين الآن، لذلك اعتقدت أنني يجب أن أسأل. أنا أستخدم QT 4.5.3 (مترجمة مع VC2008) على Win7.

لدي mygraphicsview (يرث qgraphicsview) و myfilter (يرث qobject) دروس.

عندما أقوم بتثبيت كائن MyFilter كمرشح حدث إلى MyGraphicsView، يتم تسليم أحداث الماوس إلى MyFilter بعد يتم تسليمها إلى mygraphicsview في حين يتم تسليم الأحداث الرئيسية إلى myfilter قبل يتم تسليمها إلى mygraphicsview.

في الحالة الثانية، أقوم بتثبيت كائن MyFilter كمرشح حدث إلى MyGraphicsView-> Viewport () (وهو عبارة عن Standart Qglwidget)، يتم تسليم أحداث الماوس إلى MyFilter قبل يتم تسليمها إلى MyGraphicsView، في حين يتم تسليم الأحداث الرئيسية إلى فقط mygraphicsview.

من المفترض أن يتم تسليم الأحداث إلى مرشحات الأحداث قبل تسليمها إلى الكائن الفعلي، فلماذا يحدث هذا؟ ماذا علي أن أفعل لضمان هذا الطلب؟

شكرا لك مقدما. مع أطيب التحيات.

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

المحلول

QGRAPHICSVIEW هي فئة فرعية من Qabstractscrollarea التي هي سبب هذه السلوكيات.

في الحالة الأولى، تضيف Qabstractscrollarea نفسها كمرشح حدث إلى MyGraphicsView عند استدعاء SetViewPort (). يلتقط مرشح الأحداث Qabstractscrollarea لحدث الماوس، أولا يرسله من خلال ViewportEvent ()، ثم إلى معالجة الأحداث Qwidget التي تنتشر مع معالجات أحداث MyGraPhicsView Muir الماوس. فقط بعد ذلك هو مرشح حدث Qabstractscrollarea النهائي ويجري تشغيل MyFilter.

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

w.viewport()->setFocusProxy(0);

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

تغيير myfilter.h.

  QObject *keyObj;
  QObject *mouseObj;

public:
  MyFilter(QObject *keyObj, QObject *mouseObj, QObject *parent = NULL);

تغيير myfilter.cpp.

MyFilter::MyFilter(QObject *keyObj, QObject *mouseObj, QObject *parent /*= NULL*/ ) : QObject(parent), keyObj(keyObj), mouseObj(mouseObj)

و

if (obj == keyObj && e->type() == QEvent::KeyPress)
{
    qDebug()<<"Key Event recieved by MyFilter";
}
else if (obj == mouseObj && e->type() == QEvent::MouseButtonPress)
{
    qDebug()<<"Mouse Event recieved by MyFilter";
}

تغيير Main.cpp.

MyFilter *filter = new MyFilter(&w, w.viewport(), &w);

// Use this line to install to the viewport
w.viewport()->installEventFilter(filter);

//Use this line to install to MyGraphicsView
w.installEventFilter(filter);

نصائح أخرى

ماذا عن محاولة عدم استخدام المرشح ولكن إعادة تشغيل معالجات Qevent اللازمة في mygraphicsview like هنا:

void MyGraphicsView::mousePressEvent(QMouseEvent* pe)
{
if (pe->buttons() & Qt::LeftButton)
{
    this->setCursor(Qt::CrossCursor);
    zoomOrigin = pe->pos();
    rubberBand = new QRubberBand(QRubberBand::Rectangle, this);
    rubberBand->setGeometry(QRect(zoomOrigin, QSize(0,0)));
    rubberBand->show();
}
if (pe->buttons() & Qt::MidButton)
{
    panOrigin = pe->pos();
        this->setCursor(Qt::ClosedHandCursor);
}
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top