我通过覆盖我的类的KeyPressEvent
方法(从QWidget
继承(来捕获密钥按下事件,但是我看不到key press press easce和backspace键的事件,以及C-x
或C-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_())