PyQt5 QCompleter定制:基于Name列匹配,填入对应Description内容
定制QCompleter实现Name匹配自动填充Description
要实现以DataFrame的Name列作为补全匹配依据,选中或输入Name后自动填入对应Description列内容的功能,核心思路是将Name和Description关联存储,在补全项被激活时替换输入框内容为Description。以下是完整可运行的代码实现:
完整代码示例
import sys import pandas as pd from PyQt5.QtWidgets import (QApplication, QWidget, QLineEdit, QVBoxLayout, QCompleter, QStandardItemModel, QStandardItem) from PyQt5.QtCore import Qt class CompleterDemo(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): # 构造示例DataFrame data = { 'Name': ['Apple', 'Banana', 'Cherry', 'Date', 'Elderberry'], 'Description': ['红色水果,富含维生素C', '黄色长条形水果', '酸甜红色浆果', '棕色热带水果', '深紫色浆果'] } self.df = pd.DataFrame(data) # 界面布局设置 layout = QVBoxLayout() self.line_edit = QLineEdit() # 绑定回车事件,处理手动输入完整Name的情况 self.line_edit.returnPressed.connect(self.on_return_pressed) layout.addWidget(self.line_edit) self.setLayout(layout) # 初始化自定义补全器 self.setup_completer() self.setWindowTitle('Name匹配填充Description') self.resize(400, 100) def setup_completer(self): # 创建模型存储Name及关联的Description model = QStandardItemModel() for _, row in self.df.iterrows(): name_item = QStandardItem(row['Name']) # 将Description存入项的用户自定义数据字段 name_item.setData(row['Description'], Qt.UserRole) model.appendRow(name_item) # 配置补全器 completer = QCompleter(model, self) # 设置匹配模式:包含匹配(可改为Qt.MatchStartsWith实现前缀匹配) completer.setFilterMode(Qt.MatchContains) # 设置补全弹窗模式 completer.setCompletionMode(QCompleter.PopupCompletion) # 绑定补全项激活信号,替换输入框内容为Description completer.activated.connect(self.on_completer_activated) self.line_edit.setCompleter(completer) def on_completer_activated(self, index): # 从选中项中取出Description description = index.data(Qt.UserRole) self.line_edit.setText(description) def on_return_pressed(self): # 处理手动输入完整Name后回车的情况 input_name = self.line_edit.text().strip() match_row = self.df[self.df['Name'] == input_name] if not match_row.empty: self.line_edit.setText(match_row.iloc[0]['Description']) if __name__ == '__main__': app = QApplication(sys.argv) demo = CompleterDemo() demo.show() sys.exit(app.exec_())
关键实现细节
- 数据关联存储:使用
QStandardItemModel存储每个Name项,并通过setData()方法将对应的Description存入Qt.UserRole字段,实现Name和Description的关联。 - 补全信号处理:连接
completer.activated信号到自定义槽函数,当用户选中补全项时,取出关联的Description并更新输入框内容。 - 手动输入处理:绑定
QLineEdit.returnPressed信号,当用户输入完整Name并回车时,自动匹配并替换为对应的Description。 - 匹配模式可选:可根据需求修改
completer.setFilterMode()的参数,比如Qt.MatchStartsWith实现前缀匹配,Qt.MatchContains实现包含匹配。
内容的提问来源于stack exchange,提问作者Ayyaz Azeem
相关产品推荐
相关产品推荐

