PyQt:如何实现点击空白区域时自动取消QListWidget的选中项?
PyQt:如何实现点击空白区域时自动取消QListWidget的选中项?
这个问题我之前也碰到过,默认QListWidget点击空白区域不取消选中的行为确实有点不符合日常使用习惯,不过咱们有两种简单的方法可以解决这个问题,一起来看看吧~
方法一:自定义QListWidget并重写鼠标点击事件
最直接的方式就是自己写一个继承自QListWidget的子类,重写它的mousePressEvent方法,在里面判断点击的位置是否落在某个item上,如果没有的话就清除选中状态。
示例代码如下:
from PyQt5.QtWidgets import QListWidget, QListWidgetItem, QApplication from PyQt5.QtCore import QPoint class MyListWidget(QListWidget): def mousePressEvent(self, event): # 获取点击的位置(相对于当前控件) click_pos = event.pos() # 判断该位置是否有对应的item item = self.itemAt(click_pos) if not item: # 如果没有item,清除所有选中项 self.clearSelection() # 别忘了调用父类的方法,保证正常的item点击行为不受影响 super().mousePressEvent(event) # 测试用例 if __name__ == "__main__": app = QApplication([]) list_widget = MyListWidget() for i in range(5): list_widget.addItem(QListWidgetItem(f"Item {i+1}")) list_widget.show() app.exec_()
方法二:给原QListWidget安装事件过滤器
如果不想自定义子类,也可以给现有的QListWidget对象安装一个事件过滤器,在主窗口或者父控件里处理点击事件。
示例代码如下:
from PyQt5.QtWidgets import QListWidget, QListWidgetItem, QApplication, QWidget, QVBoxLayout from PyQt5.QtCore import QEvent class MainWindow(QWidget): def __init__(self): super().__init__() self.layout = QVBoxLayout(self) self.list_widget = QListWidget() for i in range(5): self.list_widget.addItem(QListWidgetItem(f"Item {i+1}")) # 给list_widget安装事件过滤器 self.list_widget.installEventFilter(self) self.layout.addWidget(self.list_widget) def eventFilter(self, obj, event): # 判断事件来源是我们的list_widget,且事件是鼠标按下 if obj == self.list_widget and event.type() == QEvent.MouseButtonPress: click_pos = event.pos() item = self.list_widget.itemAt(click_pos) if not item: self.list_widget.clearSelection() # 调用父类的事件过滤器,保证其他事件正常处理 return super().eventFilter(obj, event) # 测试用例 if __name__ == "__main__": app = QApplication([]) window = MainWindow() window.show() app.exec_()
这两种方法都能实现点击空白区域自动取消选中的效果,你可以根据自己的项目结构选择合适的方式~
备注:内容来源于stack exchange,提问作者Ennol1
相关产品推荐
相关产品推荐

