forked from wang-bin/QtAV
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGraphicsItemRenderer.cpp
122 lines (110 loc) · 3.89 KB
/
GraphicsItemRenderer.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/******************************************************************************
QtAV: Media play library based on Qt and FFmpeg
Copyright (C) 2012-2013 Wang Bin <[email protected]>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
******************************************************************************/
#include <QtAV/GraphicsItemRenderer.h>
#include <private/GraphicsItemRenderer_p.h>
#include <QGraphicsScene>
#include <QtGui/QPainter>
#include <QEvent>
#include <QKeyEvent>
#include <QtAV/EventFilter.h>
#include <QGraphicsSceneEvent>
namespace QtAV {
GraphicsItemRenderer::GraphicsItemRenderer(QGraphicsItem * parent)
:GraphicsWidget(parent),ImageRenderer(*new GraphicsItemRendererPrivate())
{
setFlag(ItemIsFocusable); //receive key events
//setAcceptHoverEvents(true);
#if CONFIG_GRAPHICSWIDGET
setFocusPolicy(Qt::ClickFocus); //for widget
#endif //CONFIG_GRAPHICSWIDGET
}
GraphicsItemRenderer::GraphicsItemRenderer(GraphicsItemRendererPrivate &d, QGraphicsItem *parent)
:GraphicsWidget(parent),ImageRenderer(d)
{
setFlag(ItemIsFocusable); //receive key events
//setAcceptHoverEvents(true);
#if CONFIG_GRAPHICSWIDGET
setFocusPolicy(Qt::ClickFocus); //for widget
#endif //CONFIG_GRAPHICSWIDGET
}
GraphicsItemRenderer::~GraphicsItemRenderer()
{
}
bool GraphicsItemRenderer::write()
{
scene()->update(sceneBoundingRect());
//update(); //does not cause an immediate paint. my not redraw.
return true;
}
QRectF GraphicsItemRenderer::boundingRect() const
{
return QRectF(0, 0, videoWidth(), videoHeight());
}
void GraphicsItemRenderer::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
Q_UNUSED(option);
Q_UNUSED(widget);
DPTR_D(GraphicsItemRenderer);
if (!d.scale_in_qt) {
d.img_mutex.lock();
}
if (!d.image.isNull()) {
if (d.image.size() == QSize(d.width, d.height))
painter->drawImage(QPointF(), d.image);
else
painter->drawImage(boundingRect(), d.image);
} else if (!d.preview.isNull()){
if (d.preview.size() == QSize(d.width, d.height))
painter->drawImage(QPointF(), d.preview);
else
painter->drawImage(boundingRect(), d.preview);
} else {
d.preview = QImage(videoSize(), QImage::Format_RGB32);
d.preview.fill(QColor(Qt::black));
painter->drawImage(QPointF(), d.preview);
}
if (!d.scale_in_qt) {
d.img_mutex.unlock();
}
}
//GraphicsWidget will lose focus forever if focus out. Why?
#if CONFIG_GRAPHICSWIDGET
bool GraphicsItemRenderer::event(QEvent *event)
{
setFocus(); //WHY: Force focus
QEvent::Type type = event->type();
qDebug("GraphicsItemRenderer event type = %d", type);
if (type == QEvent::KeyPress) {
qDebug("KeyPress Event. key=%d", static_cast<QKeyEvent*>(event)->key());
}
return true;
}
#else
/*simply passes event to QGraphicsWidget::event(). you should not have to
*reimplement sceneEvent() in a subclass of QGraphicsWidget.
*/
/*
bool GraphicsItemRenderer::sceneEvent(QEvent *event)
{
QEvent::Type type = event->type();
qDebug("sceneEvent type = %d", type);
if (type == QEvent::KeyPress) {
qDebug("KeyPress Event. key=%d", static_cast<QKeyEvent*>(event)->key());
}
return true;
}
*/
#endif //!CONFIG_GRAPHICSWIDGET
} //namespace QtAV