Skip to main content
Tweeted twitter.com/StackGIS/status/1328442723427377155
Bumped by Community user
improving code format
Source Link
xunilk
  • 30.2k
  • 4
  • 43
  • 82

I'm trying to capture MouseClick events on the QgsMapCanvas. The goal is to intercept the right mouse button and display a custom context menu. If the right mouse button is pressed with a modifier key (SHIFT+CTRL for example), the active tool action should be triggered.

I tried to install an event filter on the QgsMapCanvas provided by the iface, but this is not working.

class MyPlugin:
    def __init__(self, iface: QgisInterface):
        self.iface = iface
        self.eventFilter: MyEventFilter = None

    def initGui(self):
        self.registerEventFilter()

    def unload(self):
        self.unregisterEventFilter()

    def registerEventFilter(self):
        if not self.eventFilter:
            self.eventFilter = MyEventFilter(self.iface.mapCanvas())
        self.iface.mapCanvas().installEventFilter(self.eventFilter)

    def unregisterEventFilter(self):
        if self.eventFilter:
            self.eventFilter.deleteLater()
            self.eventFilter = None

and the EventHandler looks like this:

class MyEventFilter(QObject):

    def __init__(self, parent: Optional[QObject] = None) -> None:
        super().__init__(parent)

    def eventFilter(self, caller: QObject, event: QEvent) -> bool:
        if event.type() == QEvent.MouseButtonRelease:
            QMessageBox.information(None, 'MyEventFilter', f'event: {event}')
            return True
        return False

But when I click, nothing happens. I guess the active tool itself is already filtering the click?

I've seen that QgsMapCanvas has signals for the mouse position as well as keypresses, but unfortunately no mouse click signals.

I know that you can implement a map tool, but the idea is to have a global contextmenu handler that is always called first. Only with a modifier key the original tool action should be triggered.

Is there any mechanism to achieve this?

I'm trying to capture MouseClick events on the QgsMapCanvas. The goal is to intercept the right mouse button and display a custom context menu. If the right mouse button is pressed with a modifier key (SHIFT+CTRL for example), the active tool action should be triggered.

I tried to install an event filter on the QgsMapCanvas provided by the iface, but this is not working.

class MyPlugin:
def __init__(self, iface: QgisInterface):
    self.iface = iface
    self.eventFilter: MyEventFilter = None

def initGui(self):
    self.registerEventFilter()

def unload(self):
    self.unregisterEventFilter()

def registerEventFilter(self):
    if not self.eventFilter:
        self.eventFilter = MyEventFilter(self.iface.mapCanvas())
    self.iface.mapCanvas().installEventFilter(self.eventFilter)

def unregisterEventFilter(self):
    if self.eventFilter:
        self.eventFilter.deleteLater()
        self.eventFilter = None

and the EventHandler looks like this:

class MyEventFilter(QObject):

def __init__(self, parent: Optional[QObject] = None) -> None:
    super().__init__(parent)

def eventFilter(self, caller: QObject, event: QEvent) -> bool:
    if event.type() == QEvent.MouseButtonRelease:
        QMessageBox.information(None, 'MyEventFilter', f'event: {event}')
        return True
    return False

But when I click, nothing happens. I guess the active tool itself is already filtering the click?

I've seen that QgsMapCanvas has signals for the mouse position as well as keypresses, but unfortunately no mouse click signals.

I know that you can implement a map tool, but the idea is to have a global contextmenu handler that is always called first. Only with a modifier key the original tool action should be triggered.

Is there any mechanism to achieve this?

I'm trying to capture MouseClick events on the QgsMapCanvas. The goal is to intercept the right mouse button and display a custom context menu. If the right mouse button is pressed with a modifier key (SHIFT+CTRL for example), the active tool action should be triggered.

I tried to install an event filter on the QgsMapCanvas provided by the iface, but this is not working.

class MyPlugin:
    def __init__(self, iface: QgisInterface):
        self.iface = iface
        self.eventFilter: MyEventFilter = None

    def initGui(self):
        self.registerEventFilter()

    def unload(self):
        self.unregisterEventFilter()

    def registerEventFilter(self):
        if not self.eventFilter:
            self.eventFilter = MyEventFilter(self.iface.mapCanvas())
        self.iface.mapCanvas().installEventFilter(self.eventFilter)

    def unregisterEventFilter(self):
        if self.eventFilter:
            self.eventFilter.deleteLater()
            self.eventFilter = None

and the EventHandler looks like this:

class MyEventFilter(QObject):

    def __init__(self, parent: Optional[QObject] = None) -> None:
        super().__init__(parent)

    def eventFilter(self, caller: QObject, event: QEvent) -> bool:
        if event.type() == QEvent.MouseButtonRelease:
            QMessageBox.information(None, 'MyEventFilter', f'event: {event}')
            return True
        return False

But when I click, nothing happens. I guess the active tool itself is already filtering the click?

I've seen that QgsMapCanvas has signals for the mouse position as well as keypresses, but unfortunately no mouse click signals.

I know that you can implement a map tool, but the idea is to have a global contextmenu handler that is always called first. Only with a modifier key the original tool action should be triggered.

Is there any mechanism to achieve this?

Source Link
TheGrudge
  • 423
  • 3
  • 9

Eventfilter on MapCanvas

I'm trying to capture MouseClick events on the QgsMapCanvas. The goal is to intercept the right mouse button and display a custom context menu. If the right mouse button is pressed with a modifier key (SHIFT+CTRL for example), the active tool action should be triggered.

I tried to install an event filter on the QgsMapCanvas provided by the iface, but this is not working.

class MyPlugin:
def __init__(self, iface: QgisInterface):
    self.iface = iface
    self.eventFilter: MyEventFilter = None

def initGui(self):
    self.registerEventFilter()

def unload(self):
    self.unregisterEventFilter()

def registerEventFilter(self):
    if not self.eventFilter:
        self.eventFilter = MyEventFilter(self.iface.mapCanvas())
    self.iface.mapCanvas().installEventFilter(self.eventFilter)

def unregisterEventFilter(self):
    if self.eventFilter:
        self.eventFilter.deleteLater()
        self.eventFilter = None

and the EventHandler looks like this:

class MyEventFilter(QObject):

def __init__(self, parent: Optional[QObject] = None) -> None:
    super().__init__(parent)

def eventFilter(self, caller: QObject, event: QEvent) -> bool:
    if event.type() == QEvent.MouseButtonRelease:
        QMessageBox.information(None, 'MyEventFilter', f'event: {event}')
        return True
    return False

But when I click, nothing happens. I guess the active tool itself is already filtering the click?

I've seen that QgsMapCanvas has signals for the mouse position as well as keypresses, but unfortunately no mouse click signals.

I know that you can implement a map tool, but the idea is to have a global contextmenu handler that is always called first. Only with a modifier key the original tool action should be triggered.

Is there any mechanism to achieve this?