4 votes

Comment attraper KeyPressedEvent de QDockWidget dans pyqt (QGIS)

J'essaie d'ajouter une certaine logique à KeyPressedEvent d'un QDockWidget. Cela fonctionne sans le QDockWidget, c'est-à-dire sur la fenêtre principale, mais cela ne fonctionne pas sur le QDockWidget.

Voici ce que j'ai essayé :

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")

Le code fonctionne bien mais la méthode keyPressed n'est pas appelée. Comment gérer le KeyPressedEvent de QDockWidget ?

5voto

Sandip Nepal Points 423

J'ai ajouté cette ligne self.dock_widget.setFocusPolicy(QtCore.Qt.StrongFocus) et maintenant cela fonctionne bien.

4voto

ncica Points 6018

keyPressEvent() La fonction : est une fonction prédéfinie dans le cadre de PyQt utilisée pour définir les fonctionnalités de l'événement de pression de touche généré. Notez que vous ne pouvez pas changer le nom de la fonction, mais que vous pouvez définir son contenu des arguments et le corps de la fonction selon vos besoins.

event.key() == QtCore.Qt.Key_Escape est utilisé dans le cadre de l'initiative fonction keyPresssEvent(). Ici, key_Escape est utilisé pour mentionner que la touche que nous allons générer l'événement est la touche Escape.

essayez :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X