我在Qt上使用MarbleWidget
和OpenStreetMap。
车轮缩放在地图上显示模糊图像。因此,我希望将鼠标滚轮与ZoomIn()
和ZoomOut()
用户同步,以便在地图上获得清晰的图像。
我想做这样的事情:
QObject::connect( MarbleWidget, SIGNAL(??????), this, SLOT(wheelEvent(wheelEvent)) );
void MainWindow::wheelEvent(QWheelEvent *event){
//....
}
我可以在MarbleWidget上使用???????
以上的任何信号或事件吗?
而且,如何在MarbleWidget上禁用鼠标缩放?
答案 0 :(得分:0)
您可以创建自己的输入处理程序并告诉MarbleWidget
使用它。这将允许您以您要求的方式拦截鼠标滚轮事件。
创建自定义输入处理程序
MarbleWidget
使用默认输入处理程序。 MarbleInputHandler.cpp
内部有一个函数eventFilter(QObject*, QEvent*)
,用于处理QEvent::Wheel
事件(除其他事项外)。从这个类派生并覆盖eventFilter
:
class MyMarbleInputHandler : public MarbleWidgetDefaultInputHandler
{
Q_OBJECT
public:
explicit MyMarbleInputHandler(MarbleWidget* mw) :
MarbleWidgetDefaultInputHandler(mw) {}
virtual bool eventFilter(QObject *o, QEvent *e);
signals:
void wheelEvent(QWheelEvent *event);
};
基本上,您想拦截QEvent::Wheel
并发出自己的信号。你自己没有处理的任何东西都应该传递给基类。
bool MyMarbleInputHandler::eventFilter(QObject *o, QEvent *e)
{
if (e->type() == QEvent::Wheel)
{
emit wheelEvent(static_cast<QWheelEvent*>(e));
return true;
}
return MarbleWidgetDefaultInputHandler::eventFilter(o, e);
}
创建自定义MarbleWidget
下面的构造函数显示了如何设置上面定义的输入处理程序。您还必须连接信号/插槽。
class MyMarbleWidget : public MarbleWidget
{
Q_OBJECT
public:
explicit MyMarbleWidget()
{
MyMarbleInputHandler *myMarbleInputHandler = new MyMarbleInputHandler(this);
setInputHandler(myMarbleInputHandler);
connect(myMarbleInputHandler, SIGNAL(wheelEvent(QWheelEvent*)),
this, SLOT(handleWheelEvent(QWheelEvent*)));
}
public slots:
void handleWheelEvent(QWheelEvent *event)
{
if (event->delta() > 0) zoomIn();
else zoomOut();
}
};
handleWheelEvent()
提供放大/缩小的代码。并非所有滚轮的工作方式都相同,因此您必须确定一步放大/缩小鼠标滚轮所需的移动量。在此示例中,它根据每个事件放大/缩小一步,仅关注delta()
的符号并忽略其大小。
您也可以查看MarbleDefaultInputHandler::handleWheel()
以查看默认行为的内容。它们在矢量图层之间使用插值/拉伸位图图像,以在缩放时提供更平滑的动画。请注意,键盘上的加号 + 和减去 - 键将允许您缩放到非插值的地图级别,而鼠标滚轮使用动画缩放(“模糊”)插值层。此行为是documented in a bug report。