Pyqt5的QWidget中放置QTableWidget导致检测

2019-05-05  本文已影响0人  不爱钱的张师傅

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() 即可。

```

上一篇 下一篇

猜你喜欢

热点阅读