如何在PyQt4的QListView中通过回车键获取并打印选中项
解决PyQt4中QListView回车键打印选中文本的问题
我来帮你搞定这个问题!你想要在QListView按下回车键时打印选中的文本,之前用installEventFilter碰到了非类型错误,我给你两种可行的实现方式,你可以选自己顺手的:
方法一:使用事件过滤器(Event Filter)
这种方法不需要修改QListView的子类,直接在你的主窗口类里实现事件过滤逻辑就行。
首先,在__init__方法里给你的listview安装事件过滤器:
self.listview.installEventFilter(self)
然后在你的List_View类里添加eventFilter方法,用来捕获回车键事件:
def eventFilter(self, obj, event): if obj == self.listview and event.type() == QtCore.QEvent.KeyPress: if event.key() == QtCore.Qt.Key_Return or event.key() == QtCore.Qt.Key_Enter: # 获取选中的项 selected_indexes = self.listview.selectedIndexes() if selected_indexes: selected_text = selected_indexes[0].data(QtCore.Qt.DisplayRole).toString() print(selected_text) return True # 表示事件已处理 return super(List_View, self).eventFilter(obj, event)
代码说明:
- 先判断事件来源是你的listview,并且是按键事件;
- 接着检查是不是回车键(包含主键盘的Return和小键盘的Enter);
- 获取选中的索引列表,如果有选中项,就取出它的显示文本并打印;
- 返回
True表示这个事件已经被处理,避免继续传递;如果不是我们要处理的事件,就调用父类的方法让它继续处理。
方法二:自定义QListView子类(重写keyPressEvent)
如果觉得事件过滤器有点绕,也可以直接写一个继承自QListView的子类,重写它的按键事件处理函数,逻辑更直观:
首先定义自定义的ListView子类:
class MyListView(QtGui.QListView): def keyPressEvent(self, event): if event.key() == QtCore.Qt.Key_Return or event.key() == QtCore.Qt.Key_Enter: selected_indexes = self.selectedIndexes() if selected_indexes: selected_text = selected_indexes[0].data(QtCore.Qt.DisplayRole).toString() print(selected_text) # 必须调用父类的方法,保证其他按键(比如上下箭头)能正常工作 super(MyListView, self).keyPressEvent(event)
然后在你的主窗口__init__里,把原来的self.listview = QtGui.QListView()改成:
self.listview = MyListView()
完整代码示例(方法一)
import sys from PyQt4 import QtCore,QtGui class List_View(QtGui.QMainWindow): def __init__(self, parent=None): super(List_View, self).__init__(parent) self.listview = QtGui.QListView() # 安装事件过滤器 self.listview.installEventFilter(self) model = QtGui.QStandardItemModel(self.listview) for i in ['linux', 'windows', 'mac os']: model.appendRow(QtGui.QStandardItem(i)) self.listview.setModel(model) widget = QtGui.QWidget() self.setCentralWidget(widget) vlay = QtGui.QVBoxLayout(widget) vlay.addWidget(self.listview) self.resize(400, 200) def eventFilter(self, obj, event): if obj == self.listview and event.type() == QtCore.QEvent.KeyPress: if event.key() == QtCore.Qt.Key_Return or event.key() == QtCore.Qt.Key_Enter: selected_indexes = self.listview.selectedIndexes() if selected_indexes: # 获取选中项的文本 selected_text = selected_indexes[0].data(QtCore.Qt.DisplayRole).toString() print(selected_text) return True return super(List_View, self).eventFilter(obj, event) if __name__ == "__main__": app = QtGui.QApplication(sys.argv) w = List_View() w.show() sys.exit(app.exec_())
之前你用installEventFilter出错,大概率是因为没有正确实现eventFilter方法,或者没有准确判断事件的来源和类型,按照上面的代码写就可以正常工作啦。
内容的提问来源于stack exchange,提问作者raghava
相关产品推荐
相关产品推荐

