【问题标题】:How to catch KeyPressedEvent of QDockWidget in pyqt (QGIS)如何在pyqt(QGIS)中捕获QDockWidget的KeyPressedEvent
【发布时间】:2019-08-22 10:35:03
【问题描述】:

我正在尝试在 QDockWidget 的 KeyPressedEvent 添加一些逻辑。它可以在没有 QDockWidget 的情况下工作,即在主窗口上,但它不能在 QDockWidget 上工作。

这是我尝试过的:


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

代码工作正常,但没有调用 keyPressed 方法。 QDockWidget的KeyPressedEvent如何处理?

【问题讨论】:

  • @eyllanesc 我已经更新了代码。我正在尝试捕捉停靠窗口的按键事件。
  • @eyllanesc 这不是问题所在。我已经从另一个班级打电话给它。代码运行正常,但无法输入 keyPressed 方法。
  • @eyllanesc 每当按下 Escape 键时,我都会尝试打印“escape Pressed”。

标签: python pyqt qgis qdockwidget


【解决方案1】:

我添加了这一行 self.dock_widget.setFocusPolicy(QtCore.Qt.StrongFocus) 现在它工作正常。

【讨论】:

  • 这是一个更好更简单的解决方案。
【解决方案2】:

keyPressEvent():是 PyQt 框架中的预定义函数 用于定义生成的按键事件的功能。 注意,你不能改变它的函数名,你可以定义它的 参数内容和函数体根据您的要求。

event.key() == QtCore.Qt.Key_Escape 正在使用 keyPressEvent() 函数。这里key_Escape用来提 我们要生成事件的键是 Escape 键。

尝试:

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

【讨论】:

  • 虽然此代码可能会解决问题,including an explanation 关于如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请编辑您的答案以添加解释并说明适用的限制和假设。
猜你喜欢
  • 2012-11-13
  • 1970-01-01
  • 2015-01-15
  • 2023-03-17
  • 2013-01-30
  • 2016-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多