pyqt5中completer点击选择改为双击选择,代码实现
时间: 2023-07-16 16:11:33 浏览: 145
python 中pyqt5 树节点点击实现多窗口切换问题
5星 · 资源好评率100%
在 PyQt5 中,QCompleter 默认是在输入框中输入关键词后,通过单击下拉框中的选项来选择完成的。若要改为双击选择,可以通过自定义 QCompleter 的 QAbstractItemView 的 mouseDoubleClickEvent() 方法来实现。
具体代码实现如下:
```python
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
class Completer(QCompleter):
def __init__(self, *args, **kwargs):
super(Completer, self).__init__(*args, **kwargs)
def eventFilter(self, object, event):
if event.type() == QEvent.KeyPress and \
event.key() in [Qt.Key_Enter, Qt.Key_Return, Qt.Key_Escape]:
# 拦截回车和ESC按键事件,这样按下这两个按键就不会让 QCompleter 关闭了
event.ignore()
return False
if event.type() == QEvent.MouseButtonPress:
# 鼠标单击事件被拦截,防止 QCompleter 在单击时关闭
event.ignore()
return False
return super(Completer, self).eventFilter(object, event)
def popup(self):
# 重载 popup() 方法,将 QCompleter 的下拉框中的 QListView 的双击事件转换为单击事件
QListView.mousePressEvent = self.listViewMousePressEvent
super(Completer, self).popup()
def listViewMousePressEvent(self, event):
# 将 QListView 的双击事件转换为单击事件
QListView.mousePressEvent = QListView.mouseReleaseEvent
QListView.mouseReleaseEvent(self.listView(), event)
QListView.mousePressEvent = self.listViewMousePressEvent
def setModel(self, model):
# 重载 setModel() 方法,为 QCompleter 的下拉框中的 QListView 安装过滤器
super(Completer, self).setModel(model)
self.listView().installEventFilter(self)
if __name__ == '__main__':
app = QApplication([])
lineEdit = QLineEdit()
completer = Completer(["apple", "banana", "cherry"])
completer.setCaseSensitivity(Qt.CaseInsensitive)
lineEdit.setCompleter(completer)
window = QWidget()
layout = QVBoxLayout(window)
layout.addWidget(lineEdit)
window.show()
app.exec_()
```
在上述代码中,我们通过自定义 Completer 类并重载其 eventFilter() 和 popup() 方法,来拦截 QCompleter 的鼠标单击事件和下拉框的双击事件,并将其转换为单击事件。另外,我们还需要为 QCompleter 的下拉框中的 QListView 安装事件过滤器,以便在 QListView 中捕获鼠标单击事件。
最后,我们将我们自定义的 Completer 对象设置为 QLineEdit 的自动完成器即可。
阅读全文