From 32b94c4ae9785299a72993ecc5800a1fcf2aa055 Mon Sep 17 00:00:00 2001 From: wang-bin Date: Thu, 17 Oct 2013 22:49:46 +0800 Subject: [PATCH] move some event handling to video renderer widget's filter bug: videogroup example can not handle key event --- src/AVPlayer.cpp | 8 ++++ src/EventFilter.cpp | 44 --------------------- src/QtAV/EventFilter.h | 1 - src/QtAV/VideoOutputEventFilter.h | 3 ++ src/QtAV/VideoRenderer.h | 3 ++ src/QtAV/private/VideoRenderer_p.h | 2 + src/VideoOutputEventFilter.cpp | 61 ++++++++++++++++++++++++------ src/VideoRenderer.cpp | 10 +++++ 8 files changed, 76 insertions(+), 56 deletions(-) diff --git a/src/AVPlayer.cpp b/src/AVPlayer.cpp index 824d50ff..fbd5923b 100644 --- a/src/AVPlayer.cpp +++ b/src/AVPlayer.cpp @@ -313,6 +313,14 @@ void AVPlayer::setPlayerEventFilter(QObject *obj) event_filter = obj; //the default event filter's parent is this, so AVPlayer will try to delete event_filter if (obj) { qApp->installEventFilter(event_filter); + } else { + //new created renderers keep the event filter + QList vos = videoOutputs(); + if (!vos.isEmpty()) { + foreach (VideoRenderer *vo, vos) { + vo->enableDefaultEventFilter(false); + } + } } } diff --git a/src/EventFilter.cpp b/src/EventFilter.cpp index 6b18c315..38582313 100644 --- a/src/EventFilter.cpp +++ b/src/EventFilter.cpp @@ -124,50 +124,6 @@ bool EventFilter::eventFilter(QObject *watched, QEvent *event) #endif //0 QEvent::Type type = event->type(); switch (type) { - case QEvent::MouseButtonPress: { - qDebug("EventFilter: Mouse press"); - QMouseEvent *me = static_cast(event); - Qt::MouseButton mbt = me->button(); - if (mbt == Qt::LeftButton) { - gMousePos = me->globalPos(); - iMousePos = me->pos(); - } - //TODO: wheel to control volume etc. - } - break; - case QEvent::MouseButtonRelease: { - QMouseEvent *me = static_cast(event); - Qt::MouseButton mbt = me->button(); - qDebug("release btn = %d", mbt); - if (mbt != Qt::LeftButton) - return false; - iMousePos = QPoint(); - gMousePos = QPoint(); - } - break; - case QEvent::MouseMove: { - if (iMousePos.isNull() || gMousePos.isNull() || !player->renderer()->widget()) - return false; - QMouseEvent *me = static_cast(event); - QWidget *window = player->renderer()->widget()->window(); - int x = window->pos().x(); - int y = window->pos().y(); - int dx = me->globalPos().x() - gMousePos.x(); - int dy = me->globalPos().y() - gMousePos.y(); - gMousePos = me->globalPos(); - window->move(x + dx, y + dy); - } - break; - case QEvent::MouseButtonDblClick: { //TODO: move to gui - QWidget *w = qApp->activeWindow(); - if (!w) - return false; - if (w->isFullScreen()) - w->showNormal(); - else - w->showFullScreen(); - } - break; case QEvent::KeyPress: { QKeyEvent *key_event = static_cast(event); int key = key_event->key(); diff --git a/src/QtAV/EventFilter.h b/src/QtAV/EventFilter.h index 69832f00..947d085d 100644 --- a/src/QtAV/EventFilter.h +++ b/src/QtAV/EventFilter.h @@ -54,7 +54,6 @@ protected: private: QMenu *menu; - QPoint gMousePos, iMousePos; }; } //namespace QtAV diff --git a/src/QtAV/VideoOutputEventFilter.h b/src/QtAV/VideoOutputEventFilter.h index f63b4c8f..d5cb6236 100644 --- a/src/QtAV/VideoOutputEventFilter.h +++ b/src/QtAV/VideoOutputEventFilter.h @@ -23,6 +23,7 @@ #define QTAV_VIDEOOUTPUTEVENTFILTER_H #include +#include #include namespace QtAV { @@ -38,8 +39,10 @@ public: private slots: void stopFiltering(); private: + void switchFullScreen(); bool mRendererIsQObj; VideoRenderer *mpRenderer; + QPoint gMousePos, iMousePos; }; } //namespace QtAV diff --git a/src/QtAV/VideoRenderer.h b/src/QtAV/VideoRenderer.h index b460bdc2..c1603baf 100644 --- a/src/QtAV/VideoRenderer.h +++ b/src/QtAV/VideoRenderer.h @@ -132,6 +132,8 @@ public: OSDFilter *osdFilter(); Filter* setSubtitleFilter(Filter *filter); Filter* subtitleFilter(); + void enableDefaultEventFilter(bool e); + bool isDefaultEventFilterEnabled() const; protected: VideoRenderer(VideoRendererPrivate &d); virtual bool needUpdateBackground() const; @@ -152,6 +154,7 @@ protected: virtual void resizeFrame(int width, int height); //TODO: parameter QRect? void handlePaintEvent(); + private: friend class VideoThread; diff --git a/src/QtAV/private/VideoRenderer_p.h b/src/QtAV/private/VideoRenderer_p.h index 4d565d17..d7d79275 100644 --- a/src/QtAV/private/VideoRenderer_p.h +++ b/src/QtAV/private/VideoRenderer_p.h @@ -57,6 +57,7 @@ public: , item_holder(0) , osd_filter(0) , subtitle_filter(0) + , default_event_filter(true) { //conv.setInFormat(PIX_FMT_YUV420P); //conv.setOutFormat(PIX_FMT_BGR32); //TODO: why not RGB32? @@ -114,6 +115,7 @@ public: QGraphicsItem *item_holder; Filter *osd_filter, *subtitle_filter; //should be at the end of list and draw top level + bool default_event_filter; }; } //namespace QtAV diff --git a/src/VideoOutputEventFilter.cpp b/src/VideoOutputEventFilter.cpp index 5ee2f75b..65eeadb0 100644 --- a/src/VideoOutputEventFilter.cpp +++ b/src/VideoOutputEventFilter.cpp @@ -56,6 +56,8 @@ bool VideoOutputEventFilter::eventFilter(QObject *watched, QEvent *event) } if (!mpRenderer) return false; + if (!mpRenderer->isDefaultEventFilterEnabled()) + return false; if (watched != mpRenderer->widget() /* && watched != mpRenderer->graphicsWidget()*/ //no showFullScreen() etc. ) @@ -64,22 +66,48 @@ bool VideoOutputEventFilter::eventFilter(QObject *watched, QEvent *event) case QEvent::KeyPress: { QKeyEvent *key_event = static_cast(event); int key = key_event->key(); - Qt::KeyboardModifiers modifiers = key_event->modifiers(); + //Qt::KeyboardModifiers modifiers = key_event->modifiers(); switch (key) { - case Qt::Key_F: { //TODO: move to gui - //TODO: active window - QWidget *w = mpRenderer->widget(); - if (!w) - return false; - if (w->isFullScreen()) - w->showNormal(); - else - w->showFullScreen(); - } + case Qt::Key_F: + switchFullScreen(); break; } } break; + case QEvent::MouseButtonDblClick: + switchFullScreen(); + break; + case QEvent::MouseButtonPress: { + QMouseEvent *me = static_cast(event); + Qt::MouseButton mbt = me->button(); + if (mbt == Qt::LeftButton) { + gMousePos = me->globalPos(); + iMousePos = me->pos(); + } + } + break; + case QEvent::MouseButtonRelease: { + QMouseEvent *me = static_cast(event); + Qt::MouseButton mbt = me->button(); + if (mbt != Qt::LeftButton) + return false; + iMousePos = QPoint(); + gMousePos = QPoint(); + } + break; + case QEvent::MouseMove: { + if (iMousePos.isNull() || gMousePos.isNull()) + return false; + QMouseEvent *me = static_cast(event); + QWidget *window = mpRenderer->widget()->window(); + int x = window->pos().x(); + int y = window->pos().y(); + int dx = me->globalPos().x() - gMousePos.x(); + int dy = me->globalPos().y() - gMousePos.y(); + gMousePos = me->globalPos(); + window->move(x + dx, y + dy); + } + break; default: break; } @@ -91,4 +119,15 @@ void VideoOutputEventFilter::stopFiltering() mpRenderer = 0; } +void VideoOutputEventFilter::switchFullScreen() +{ + if (!mpRenderer || !mpRenderer->widget()) + return; + QWidget *window = mpRenderer->widget()->window(); + if (window->isFullScreen()) + window->showNormal(); + else + window->showFullScreen(); +} + } //namespace QtAV diff --git a/src/VideoRenderer.cpp b/src/VideoRenderer.cpp index 4766277c..2259e294 100644 --- a/src/VideoRenderer.cpp +++ b/src/VideoRenderer.cpp @@ -391,4 +391,14 @@ void VideoRenderer::handlePaintEvent() //end paint. how about QPainter::endNativePainting()? } +void VideoRenderer::enableDefaultEventFilter(bool e) +{ + d_func().default_event_filter = e; +} + +bool VideoRenderer::isDefaultEventFilterEnabled() const +{ + return d_func().default_event_filter; +} + } //namespace QtAV