mirror of
https://github.com/wang-bin/QtAV.git
synced 2026-10-28 11:07:07 +08:00
move some event handling to video renderer widget's filter
bug: videogroup example can not handle key event
This commit is contained in:
@@ -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<VideoRenderer*> vos = videoOutputs();
|
||||
if (!vos.isEmpty()) {
|
||||
foreach (VideoRenderer *vo, vos) {
|
||||
vo->enableDefaultEventFilter(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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<QMouseEvent*>(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<QMouseEvent*>(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<QMouseEvent*>(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<QKeyEvent*>(event);
|
||||
int key = key_event->key();
|
||||
|
||||
@@ -54,7 +54,6 @@ protected:
|
||||
|
||||
private:
|
||||
QMenu *menu;
|
||||
QPoint gMousePos, iMousePos;
|
||||
};
|
||||
|
||||
} //namespace QtAV
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
#define QTAV_VIDEOOUTPUTEVENTFILTER_H
|
||||
|
||||
#include <QtCore/QObject>
|
||||
#include <QtCore/QPoint>
|
||||
#include <QtAV/QtAV_Global.h>
|
||||
|
||||
namespace QtAV {
|
||||
@@ -38,8 +39,10 @@ public:
|
||||
private slots:
|
||||
void stopFiltering();
|
||||
private:
|
||||
void switchFullScreen();
|
||||
bool mRendererIsQObj;
|
||||
VideoRenderer *mpRenderer;
|
||||
QPoint gMousePos, iMousePos;
|
||||
};
|
||||
|
||||
} //namespace QtAV
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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<QKeyEvent*>(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<QMouseEvent*>(event);
|
||||
Qt::MouseButton mbt = me->button();
|
||||
if (mbt == Qt::LeftButton) {
|
||||
gMousePos = me->globalPos();
|
||||
iMousePos = me->pos();
|
||||
}
|
||||
}
|
||||
break;
|
||||
case QEvent::MouseButtonRelease: {
|
||||
QMouseEvent *me = static_cast<QMouseEvent*>(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<QMouseEvent*>(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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user