1

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?

Faiz Kidwai
  • 463
  • 5
  • 26
Sandip Nepal
  • 94
  • 3
  • 15

2 Answers2

4

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")
ncica
  • 7,015
  • 1
  • 15
  • 37
  • 3
    While this code may solve the question, [including an explanation](https://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) of how and why this solves the problem would really help to improve the quality of your post, and probably result in more up-votes. Remember that you are answering the question for readers in the future, not just the person asking now. Please edit your answer to add explanations and give an indication of what limitations and assumptions apply. – Busti Apr 01 '19 at 15:41
3

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

Sandip Nepal
  • 94
  • 3
  • 15