美文网首页
Pyqt5的QWidget中放置QTableWidget导致检测

Pyqt5的QWidget中放置QTableWidget导致检测

作者: 不爱钱的张师傅 | 来源:发表于2019-05-05 23:15 被阅读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() 即可。

    ```

    相关文章

      网友评论

          本文标题:Pyqt5的QWidget中放置QTableWidget导致检测

          本文链接:https://www.haomeiwen.com/subject/eeokoqtx.html