OSGEarth埋め込みQtのQGraphicsViewフレームワーク(一)
最近OSGEarthを勉强して、exampleを见て、自分でQtを结び付けていくつかの小さい例を书いて、特にここで记录します.
まず、OE(OSGEarth)がQGraphicsViewに埋め込まれていることを考慮すると、まずボタンやマウスイベントを受け取るのがQGraphicsViewであるため、まずこの膨大なイベントを処理する必要がある.コードは以下の通りである:eventadapter.h
実装ファイルは以下の通りである:eventadapter.cpp
また、タッチパネル操作が必要であれば、ダミー関数
まず、OE(OSGEarth)がQGraphicsViewに埋め込まれていることを考慮すると、まずボタンやマウスイベントを受け取るのがQGraphicsViewであるため、まずこの膨大なイベントを処理する必要がある.コードは以下の通りである:eventadapter.h
class EventAdapter : public QGraphicsView
{
public:
EventAdapter();
~EventAdapter();
protected:
//
virtual void keyPressEvent(QKeyEvent* event);
virtual void keyReleaseEvent(QKeyEvent* event);
//
virtual void mousePressEvent(QMouseEvent* event);
virtual void mouseReleaseEvent(QMouseEvent* event);
//
virtual void mouseDoubleClickEvent(QMouseEvent* event);
virtual void mouseMoveEvent(QMouseEvent* event);
//
virtual void wheelEvent(QWheelEvent* event);
//
virtual void resizeEvent(QResizeEvent *event);
//
virtual void moveEvent(QMoveEvent* event);
// timerEvent
virtual void timerEvent(QTimerEvent *event);
private:
void setKeyboardModifiers(QInputEvent* event);
protected:
osgViewer::GraphicsWindow* m_pGraphicsWindow;
};
実装ファイルは以下の通りである:eventadapter.cpp
void EventAdapter::keyPressEvent(QKeyEvent* event)
{
QPoint pos = QCursor::pos();
QList*> listItems = items(mapToScene(pos.x(), pos.y()).toPoint());
if (listItems.size() <= 0)
{
setKeyboardModifiers(event);
m_pGraphicsWindow->getEventQueue()->keyPress(
(osgGA::GUIEventAdapter::KeySymbol)*(event->text().toLatin1().data()));
}
QGraphicsView::keyPressEvent(event);
}
void EventAdapter::keyReleaseEvent(QKeyEvent* event)
{
setKeyboardModifiers(event);
m_pGraphicsWindow->getEventQueue()->keyRelease(
(osgGA::GUIEventAdapter::KeySymbol)*(event->text().toLatin1().data()));
QGraphicsView::keyReleaseEvent(event);
}
void EventAdapter::mousePressEvent(QMouseEvent* event)
{
QPoint pos = event->pos();
QList*> listItems = items(mapToScene(pos.x(), pos.y()).toPoint());
if (listItems.size() > 0)
{
QGraphicsView::mousePressEvent(event);
}
else
{
int button = 0;
switch (event->button())
{
case Qt::LeftButton: button = 1; break;
case Qt::MidButton: button = 2; break;
case Qt::RightButton: button = 3; break;
case Qt::NoButton: button = 0; break;
default: button = 0; break;
}
setKeyboardModifiers(event);
m_pGraphicsWindow->getEventQueue()->mouseButtonPress(event->x(), event->y(), button);
}
}
void EventAdapter::mouseReleaseEvent(QMouseEvent* event)
{
int button = 0;
switch (event->button())
{
case Qt::LeftButton: button = 1; break;
case Qt::MidButton: button = 2; break;
case Qt::RightButton: button = 3; break;
case Qt::NoButton: button = 0; break;
default: button = 0; break;
}
setKeyboardModifiers(event);
m_pGraphicsWindow->getEventQueue()->mouseButtonRelease(event->x(), event->y(), button);
QGraphicsView::mouseReleaseEvent(event);
}
void EventAdapter::mouseDoubleClickEvent(QMouseEvent* event)
{
QPoint pos = QCursor::pos();
QList*> listItems = items(mapToScene(pos.x(), pos.y()).toPoint());
if (listItems.size() > 0)
{
return;
}
int button = 0;
switch (event->button())
{
case Qt::LeftButton: button = 1; break;
case Qt::MidButton: button = 2; break;
case Qt::RightButton: button = 3; break;
case Qt::NoButton: button = 0; break;
default: button = 0; break;
}
setKeyboardModifiers(event);
m_pGraphicsWindow->getEventQueue()->mouseDoubleButtonPress(event->x(), event->y(), button);
QGraphicsView::mouseDoubleClickEvent(event);
}
void EventAdapter::mouseMoveEvent(QMouseEvent* event)
{
setKeyboardModifiers(event);
m_pGraphicsWindow->getEventQueue()->mouseMotion(event->x(), event->y());
QGraphicsView::mouseMoveEvent(event);
}
void EventAdapter::wheelEvent(QWheelEvent* event)
{
setKeyboardModifiers(event);
m_pGraphicsWindow->getEventQueue()->mouseScroll(
event->orientation() == Qt::Vertical ?
(event->delta() > 0 ? osgGA::GUIEventAdapter::SCROLL_UP : osgGA::GUIEventAdapter::SCROLL_DOWN) :
(event->delta() > 0 ? osgGA::GUIEventAdapter::SCROLL_LEFT : osgGA::GUIEventAdapter::SCROLL_RIGHT));
QGraphicsView::wheelEvent(event);
}
void EventAdapter::resizeEvent(QResizeEvent *event)
{
if (scene())
{
scene()->setSceneRect(QRect(QPoint(0, 0), event->size()));
}
const QSize& size = event->size();
m_pGraphicsWindow->resized(x(), y(), size.width(), size.height());
m_pGraphicsWindow->getEventQueue()->windowResize(x(), y(), size.width(), size.height());
m_pGraphicsWindow->requestRedraw();
const QSize& oldSize = event->oldSize();
int oldWidth = oldSize.width();
int oldHeight = oldSize.height();
int newWidth = size.width();
int newHeight = size.height();
double widthChangeRatio = double(newWidth) / double(oldWidth);
double heigtChangeRatio = double(newHeight) / double(oldHeight);
double aspectRatioChange = widthChangeRatio / heigtChangeRatio;
QGraphicsView::resizeEvent(event);
}
void EventAdapter::moveEvent(QMoveEvent* event)
{
const QPoint& pos = event->pos();
m_pGraphicsWindow->resized(pos.x(), pos.y(), width(), height());
m_pGraphicsWindow->getEventQueue()->windowResize(pos.x(), pos.y(), width(), height());
QGraphicsView::moveEvent(event);
}
void EventAdapter::timerEvent(QTimerEvent *event)
{
scene()->update();
}
また、タッチパネル操作が必要であれば、ダミー関数
virtual bool viewportEvent(QEvent* event);
を再実現する必要がある