考虑过使用QTableWidget的selectedItems()方法,如果点击的item内容为空,则方法返回的结果是空的,这样不能和点击table空白处区分。 最后用安装事件过滤器的方法实现了,用到了viewport,QModelIndex,看代码中的注释

实现效果

代码

# 主函数处创建事件过滤器实例,要安装在viewport上,viewport可以响应到点击事件
# TableWidget响应不到点击事件
self.event_filter = TableWidgetFilter(self.ui.headersTable)
self.ui.headersTable.viewport().installEventFilter(self.event_filter)

....

class TableWidgetFilter(QObject):
    def __init__(self, parent=None):
        super(TableWidgetFilter, self).__init__(parent)
    
    def eventFilter(self, watched, event):
        if event.type() == QEvent.MouseButtonRelease:
            # parentWidget()方法获取TableWidget,indexAt获取的是QModelIndex
            # QModelIndex 可以获取当前点击的行
            idx = watched.parentWidget().indexAt(event.position().toPoint())
            if(idx.row() < 0):
                watched.parentWidget().setCurrentItem(None)
        return super(TableWidgetFilter, self).eventFilter( watched, event)