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

如何通过QLineEdit筛选ScrollArea中自定义卡片的指定属性?

实现PyQt中MemberCard卡片的搜索筛选功能

问题背景

在Qt Designer开发的PyQt应用中,ScrollArea容器内已填充自定义MemberCard组件,卡片包含用户名称、ID、用户名等信息。需要通过ScrollArea外的QLineEdit组件,根据上述属性对卡片进行筛选,但尚未实现该功能。

解决方案步骤

  • 存储所有卡片实例:将创建的每个MemberCard存入列表,方便后续遍历筛选
  • 绑定搜索框信号:给QLineEdit的textChanged信号绑定筛选函数
  • 实现筛选逻辑:根据输入关键词,检查卡片的目标属性,控制卡片显示/隐藏

修改后的完整代码

MainWindow类修改

class MainWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)        
        # users_df: dataframe with users data
        users_df, groups_df = extract_load_data()        
        # scrollArea
        scroll_area = self.ui.scrollArea_cards_members
        # 创建容器部件
        content_widget = QWidget()
        scroll_area.setWidget(content_widget)
        scroll_area.setWidgetResizable(True)
        # 设置布局
        self.scroll_layout = QVBoxLayout(content_widget)
        # 存储所有MemberCard实例
        self.member_cards = []
        # 遍历数据创建卡片
        for idx in users_df.index:
            member_series = users_df.iloc[idx]
            member_card = MemberCard(member_series)
            self.scroll_layout.addWidget(member_card)
            self.member_cards.append(member_card)
        # 顶部对齐,剩余空间留白
        self.scroll_layout.addStretch()
        
        # 绑定搜索框文本变化信号到筛选函数
        self.ui.lineEdit_search.textChanged.connect(self.filter_member_cards)
        
        self.show()

    def filter_member_cards(self, keyword):
        """根据关键词筛选MemberCard卡片"""
        keyword = keyword.lower().strip()
        for card in self.member_cards:
            # 获取卡片的目标属性并转为小写
            name = card.dict['name'].lower()
            username = card.dict['username'].lower()
            user_id = str(card.dict['id']).lower()
            # 检查是否匹配关键词
            if keyword in name or keyword in username or keyword in user_id:
                card.show()
            else:
                card.hide()

MemberCard类(可选优化)

如果想让属性访问更规范,可添加获取筛选属性的方法,避免直接访问内部字典:

class MemberCard(QWidget):
    '''
    Member card widget class
    '''
    def __init__(self, member_series, parent=None):
        super(MemberCard, self).__init__(parent)
        self.member_data = dict(member_series)
        self.card = Ui_MemberCard()
        self.card.setupUi(self)
        self.fill_card_info()
        
    def fill_card_info(self):
        '''填充卡片信息'''
        self.card.name_label.setText(self.member_data['name'])
        self.card.username.setText(self.member_data['username'])
        self.card.id.setText(str(self.member_data['id']))
        self.card.joined_in.setText(self.member_data['created_at'])
    
    def get_filter_attributes(self):
        """返回用于筛选的属性值(小写)"""
        return {
            'name': self.member_data['name'].lower(),
            'username': self.member_data['username'].lower(),
            'id': str(self.member_data['id']).lower()
        }

此时筛选函数可简化为:

def filter_member_cards(self, keyword):
    keyword = keyword.lower().strip()
    for card in self.member_cards:
        attrs = card.get_filter_attributes()
        if any(keyword in val for val in attrs.values()):
            card.show()
        else:
            card.hide()

说明

  • 筛选逻辑支持不区分大小写,并自动去除关键词首尾空格
  • 通过show()/hide()方法控制卡片显示,无需重新创建或删除组件,性能更优
  • 若需要更复杂的筛选规则(如精确匹配、多条件组合),可修改filter_member_cards中的判断逻辑

内容的提问来源于stack exchange,提问作者olenscki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 22:55:48