同步鼠标滚轮和MarbleWidget(ZoomIn(),ZoomOut())

时间:2014-07-30 12:36:08

标签: c++ qt openstreetmap kde

我在Qt上使用MarbleWidget和OpenStreetMap。

车轮缩放在地图上显示模糊图像。因此,我希望将鼠标滚轮与ZoomIn()ZoomOut()用户同步,以便在地图上获得清晰的图像。

我想做这样的事情:

QObject::connect( MarbleWidget, SIGNAL(??????), this, SLOT(wheelEvent(wheelEvent)) ); 

void MainWindow::wheelEvent(QWheelEvent *event){
    //....
}

我可以在MarbleWidget上使用???????以上的任何信号或事件吗?

而且,如何在MarbleWidget上禁用鼠标缩放?

1 个答案:

答案 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