Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to catch KeyPressedEvent of QDockWidget in pyqt (QGIS)

I am trying to add some logic at KeyPressedEvent of a QDockWidget. It works without the QDockWidget, i.e., on the main window, but it does not work on the QDockWidget.

Here is what I have tried:


from PyQt5 import QtCore
from PyQt5.QtWidgets import *
from qgis.core import QgsProject
from .progress_bar import Ui_MainWindow_Progress

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QApplication.translate(context, text, disambig)

class Ui_MainWindow(QMainWindow):

    def __init__(self, iface):
        super().__init__()
        self.iface = iface

    def setupUi(self, MainWindow):

        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(356, 750)

        self.pushButton_exit = QPushButton(MainWindow)
        self.pushButton_exit.setGeometry(QtCore.QRect(290, 0, 50, 23))
        self.pushButton_exit.setObjectName(_fromUtf8("pushButton_exit"))
        self.pushButton_exit.setStyleSheet("background-color: red")

        self.label_4 = QLabel(MainWindow)
        self.label_4.setGeometry(QtCore.QRect(20, 300, 81, 20))
        self.label_4.setObjectName(_fromUtf8("label_4"))

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        self.dock_widget = QDockWidget("My Plugin", self.iface.mainWindow())
        self.dock_widget.setWidget(MainWindow)
        self.dock_widget.setFixedWidth(356)
        self.dock_widget.setFixedHeight(750)
        self.iface.addDockWidget(QtCore.Qt.RightDockWidgetArea, 
        self.dock_widget)
        self.dock_widget.setFeatures(QDockWidget.DockWidgetFloatable |
                                QDockWidget.DockWidgetMovable)
        self.dock_widget.keyPressEvent = self.keyPressed

    def keyPressed(self, event):
        if event.key() == QtCore.Qt.Key_Escape:
            print("Escape pressed")

The code is working fine but the keyPressed method is not called. How to handle KeyPressedEvent of QDockWidget?

like image 536
Sandip Nepal Avatar asked Jan 02 '23 02:01

Sandip Nepal


2 Answers

keyPressEvent() : is a predefined function in PyQt framework used to define the functionalities of the key press event generated. Note that, you can’t change its function name, you can define its argument content and function body as per your requirement.

event.key() == QtCore.Qt.Key_Escape is being used under the keyPresssEvent() function. Here, key_Escape is used to mention that the key we are going to generate event is the Escape key.

try:

def keyPressEvent(self, event):
    if event.key() == QtCore.Qt.Key_Escape:
         print("Escape pressed")
like image 98
ncica Avatar answered Jan 03 '23 16:01

ncica


I added this line self.dock_widget.setFocusPolicy(QtCore.Qt.StrongFocus) and now its working fine.

like image 40
Sandip Nepal Avatar answered Jan 03 '23 15:01

Sandip Nepal