Qwidget无法捕获Escape,Backspace或C-X密钥按事件



我通过覆盖我的类的KeyPressEvent方法(从QWidget继承(来捕获密钥按下事件,但是我看不到key press press easce和backspace键的事件,以及C-xC-c。我可以看到键版本事件。谁抓住了他们?

class KeyCaptureWidget(QWidget):
    # init…
    def keyPressEvent(self, event):
        key = event.key()
        logging.info("key press: {}".format(key))
    def keyReleaseEvent(self, event):
        key_code = event.key()
        logging.info("key release: {}".format(key_code))

C-x和Say C-b之间的区别如下:

  • C-b打印:按下控件,按下B,释放B,释放控制。
  • C-x打印:按下控制,[Nothing],X发布,释放控制。

在我的qwidget中,我使用了qvboxlayout,对此我添加了两个qwebengine视图。我试图覆盖qwebengineview的关键按下方法,但它们似乎没有抓住任何东西(这是我期望的行为(。

    def __init__(self):
        self.qtwindow = KeyCaptureWidget()
        self.layout = QVBoxLayout()
        self.view1 = QWebEngineView()  # or a custom one to override keyPressEvent
        # self.view2 = the same
        self.layout.addWidget(self.view1)
        self.layout.addWidget(self.view2)
        self.qtwindow.setLayout(self.layout)
        self.qtwindow.show()

我试图在Qwidget类上使用事件过滤器捕获这些内容,但是再次,没有运气:我只看到ESC或Backspace的密钥版本。

    def __init__(self):
        super().__init__()
        self.installEventFilter(self)
    def eventFilter(self, source, event):
        logging.info("event filter: {}".format(event))
        if event.type() == QEvent.KeyPress:
            logging.info(" event filter key PRESS")
        if event.type() == QEvent.KeyRelease:
            logging.info(" event filter key RELEASE")
        return True

我该如何抓住它们?谢谢。

事件并不一定在所有小部件之间传播,如果小部件消耗了它,那么它将不再向父母传播。在键盘事件的情况下,只有将重点的小部件首先消耗,在您的情况下,Qwebengineview以前会消耗它们,并防止其投影到其他小部件中。如果您想从窗口的键盘上听到事件,则必须使用qshortcuts,为此,您必须创建一个qshortcut:

  • ctrl c QtGui.QKeySequence("Ctrl+C")
  • ctrl x QtGui.QKeySequence("Ctrl+X")
  • ESC QtGui.QKeySequence("Escape")
  • backspace QtGui.QKeySequence("Backspace")

考虑到上述问题,解决方案是:

from PyQt5 import QtCore, QtGui, QtWidgets, QtWebEngineWidgets

class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)
        self.m_view1 = QtWebEngineWidgets.QWebEngineView()
        self.m_view2 = QtWebEngineWidgets.QWebEngineView()
        self.m_view1.load(QtCore.QUrl("https://stackoverflow.com/questions/56890831"))
        self.m_view2.load(QtCore.QUrl("https://doc.qt.io/"))
        lay = QtWidgets.QVBoxLayout(self)
        lay.addWidget(self.m_view1)
        lay.addWidget(self.m_view2)
        QtWidgets.QShortcut(
            QtGui.QKeySequence("Ctrl+C"), self, activated=self.on_Ctrl_C
        )
        QtWidgets.QShortcut(
            QtGui.QKeySequence("Ctrl+X"), self, activated=self.on_Ctrl_X
        )
        QtWidgets.QShortcut(
            QtGui.QKeySequence("Escape"), self, activated=self.on_Escape
        )
        QtWidgets.QShortcut(
            QtGui.QKeySequence("Backspace"), self, activated=self.on_Backspace
        )
    @QtCore.pyqtSlot()
    def on_Ctrl_C(self):
        print("Ctrl+C")
    @QtCore.pyqtSlot()
    def on_Ctrl_X(self):
        print("Ctrl+X")
    @QtCore.pyqtSlot()
    def on_Escape(self):
        print("Escape")
    @QtCore.pyqtSlot()
    def on_Backspace(self):
        print("Backspace")

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    w.resize(640, 480)
    w.show()
    sys.exit(app.exec_())

最新更新