Синхронизация колесика мыши и MarbleWidget (ZoomIn (), ZoomOut ())

я использую MarbleWidget с OpenStreetMap на Qt.

Колесо зума показывает размытые изображения на карте. Поэтому я хочу синхронизировать колесо мыши с ZoomIn() а также ZoomOut() Зарегестрируйте пользователя, чтобы получить четкие изображения на карте.

Я хочу сделать что-то вроде этого:

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

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

Есть ли какой-либо сигнал или событие, которое я могу использовать для MarbleWidget для ??????? выше линии?

И как я могу отключить масштабирование мыши на MarbleWidget?

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() чтобы увидеть, что происходит с поведением по умолчанию. Они используют интерполированные / растянутые растровые изображения между векторными слоями, чтобы обеспечить более плавную анимацию при масштабировании. Обратите внимание, что плюс+ и минус- Клавиши на клавиатуре позволят вам приблизиться к уровням карты без интерполяции, тогда как колесо мыши увеличит масштаб, используя анимированные («размытые») интерполированные слои. Такое поведение задокументировано в отчете об ошибке.

0

Другие решения


По вопросам рекламы [email protected]