QWieget 中简单放置一个 QTableWidget ,结果 QWieget 的 keyPressEvent 函数都检测不到键盘事件了。
实际上是 QTableWidget 截获了 键盘事件 导致 QWidget 无法再接收到同一个键盘事件
### 1. 原代码 ###
```
import sys
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtWidgets import QWidget,QTableWidget, QHBoxLayout
from PyQt5.QtCore import QEvent
class MainHandle(QWidget):
def __init__(self):
QWidget.__init__(self, windowTitle="示例")
self.init_out_table_widget() # 添加一个 QTableWidget 后,无法再检测到数字和字母的 QEvent.KeyPress 键盘事件。
self.setGeometry(600,300,1000,600)
def init_out_table_widget(self):
self.outTableWidget = QTableWidget() # QTableWidgetMy()
self.outTableWidget.setGeometry(100,100,200,100)
layout = QHBoxLayout()
layout.addWidget(self.outTableWidget)
self.setLayout(layout)
def event(self, event):
# print("QEvent.type()=",event.type())
# if event.type() == QEvent.KeyPress:
# print("key=",event.key())
return QWidget.event(self, event)
# 检测键盘按键
def keyPressEvent(self, event):
print("按下:",event.key())
if __name__ == "__main__":
app=QtWidgets.QApplication(sys.argv)
mainWidget=MainHandle()
mainWidget.show()
sys.exit(app.exec_())
```
将 self.init_out_table_widget() 注释,即去除 QTableWidget 后,可以检测到键盘事件
### 2. 解决方案: ###
自定义 QTableWidget ,重写它的 keyPressEvent ,将要做的逻辑放在这个函数里就行了。
我这里自定义为:QTableWidgetMy
```
class QTableWidgetMy(QTableWidget):
def __init__(self):
QTableWidget.__init__(self)
self.outTableWidget = None
def event(self, event):
# print("QTableWidgetMy,QEvent.type()=",event.type())
# if event.type() == QEvent.KeyPress:
# print("QTableWidgetMy,key=",event.key())
return QTableWidget.event(self, event)
def keyPressEvent(self, event):
print("QTableWidgetMy,键盘按下:",event.key())
```
将原代码中
```
self.outTableWidget = QTableWidget() 改为:
self.outTableWidget = QTableWidgetMy() 即可。
```
网友评论