PyQt5实现只读QCompleter:仅显示匹配项不可选择
实现QCompleter只读(仅展示候选,禁止选择)
要实现仅展示匹配候选、不允许选择的QCompleter,核心是禁用候选列表的交互能力,同时阻止自动填充行为。可以通过修改QCompleter的弹出视图属性,结合信号拦截来实现。
修改后的完整代码如下:
from PyQt5.QtWidgets import QApplication, QWidget, QCompleter, QLineEdit, QVBoxLayout, QAbstractItemView from PyQt5.QtCore import Qt, QStringListModel import sys class MainWindow(QWidget): def __init__(self, parent=None): super().__init__(parent) self.testthislineEdit = QLineEdit() temp_list = ['alpha', 'beta', 'boota', 'beita'] model = QStringListModel() model.setStringList(temp_list) completer = QCompleter() completer.setFilterMode(Qt.MatchContains) completer.setCaseSensitivity(Qt.CaseInsensitive) completer.setModel(model) # 配置候选列表为只读状态 popup = completer.popup() # 禁止选中任何项,消除高亮效果 popup.setSelectionMode(QAbstractItemView.NoSelection) # 移除焦点,避免键盘操作触发选择 popup.setFocusPolicy(Qt.NoFocus) # 让视图忽略鼠标事件,阻止点击选择 popup.setAttribute(Qt.WA_TransparentForMouseEvents) # 拦截激活信号,避免内容自动填充到输入框 completer.activated.connect(lambda _: None) layout = QVBoxLayout() layout.addWidget(self.testthislineEdit) self.setLayout(layout) self.testthislineEdit.setCompleter(completer) if __name__ == "__main__": app = QApplication(sys.argv) window = MainWindow() window.show() try: sys.exit(app.exec_()) except SystemExit: print('Closing Window...')
关键修改说明:
popup.setSelectionMode(QAbstractItemView.NoSelection):彻底禁用候选项的选中功能,不会出现任何高亮效果popup.setFocusPolicy(Qt.NoFocus):移除候选列表的焦点,用户无法通过上下箭头等键盘操作触发选择popup.setAttribute(Qt.WA_TransparentForMouseEvents):让候选列表忽略所有鼠标事件,点击操作不会产生任何响应completer.activated.connect(lambda _: None):拦截候选项激活信号,即使有意外触发的情况,也不会将内容填充到输入框
这样配置后,QCompleter会正常展示匹配的候选列表,但用户无法选中任何项,完全符合只读展示的需求。
内容的提问来源于stack exchange,提问作者Mian
相关产品推荐
相关产品推荐

