You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 09:40:28