я использую MarbleWidget
с OpenStreetMap на Qt.
Колесо зума показывает размытые изображения на карте. Поэтому я хочу синхронизировать колесо мыши с ZoomIn()
а также ZoomOut()
Зарегестрируйте пользователя, чтобы получить четкие изображения на карте.
Я хочу сделать что-то вроде этого:
QObject::connect( MarbleWidget, SIGNAL(??????), this, SLOT(wheelEvent(wheelEvent)) );
void MainWindow::wheelEvent(QWheelEvent *event){
//....
}
Есть ли какой-либо сигнал или событие, которое я могу использовать для MarbleWidget для ???????
выше линии?
И как я могу отключить масштабирование мыши на MarbleWidget?
Вы можете сделать свой собственный обработчик ввода и сказать 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()
чтобы увидеть, что происходит с поведением по умолчанию. Они используют интерполированные / растянутые растровые изображения между векторными слоями, чтобы обеспечить более плавную анимацию при масштабировании. Обратите внимание, что плюс+ и минус- Клавиши на клавиатуре позволят вам приблизиться к уровням карты без интерполяции, тогда как колесо мыши увеличит масштаб, используя анимированные («размытые») интерполированные слои. Такое поведение задокументировано в отчете об ошибке.