代码之家  ›  专栏  ›  技术社区  ›  spitfiredd

搜索/筛选QListWidget的自定义小部件

  •  1
  • spitfiredd  · 技术社区  · 6 年前

    如何在QListWidget中搜索/过滤自定义Widget?

    例如,我有一个自定义窗体小部件,

    class MetadataForm(QtWidgets.QWidget):
        def __init__(self, data, parent=None):
            super(MetadataForm, self).__init__(parent)
    
            self.ui = Ui_MetaInfo()
            self.ui.setupUi(self)
            self.data = data
            self.keywords = data['keywords']
    
            self.ui.pkg_name.setText(self.data['name'])
            self.ui.pkg_version.setText(self.data['version'])
            self.ui.pkg_desc.setText(self.data['desc'])
            self.ui.pkg_author_lbl.setText(self.data['author'])
            self.ui.pkg_pubdate_lbl.setText(self.data['pub_date'])
    
            self.ui.install_btn.clicked.connect(self.install_pkg)
    
        def install_pkg(self):
            print('hello from {}'.format(self.data['name']))
    

    MainWindow

    class MainWindow(QtWidgets.QDialog):
        def __init__(self, data, parent=None):
            super(MainWindow, self).__init__(parent)
            self.data = data
            self.ui = Ui_Main()
            self.ui.setupUi(self)
            self.set_catalog_data()
    
        def set_catalog_data(self):
            for item in self.data:
                # print(item)
                metadata = MetadataForm(item)
                print(metadata.keywords)
                lst_item = QtWidgets.QListWidgetItem()
                self.ui.catalog_list_wid.insertItem(
                    self.ui.catalog_list_wid.count(),
                    lst_item
                )
                self.ui.catalog_list_wid.setItemWidget(lst_item, metadata)
                lst_item.setSizeHint(metadata.sizeHint())
    

    主窗口 self.ui.search_box ,如何筛选自定义项 QListWidgetItem 基于我的元数据类的关键字属性?

    test_data = [
        {
            'name': 'Foo Model',
            'version': 'v1.0.0.1',
            'desc': lorem.paragraph(),
            'author': 'Jane Doe',
            'pub_date': '10/14/2018',
            'keywords': ['foo']
        },
        {
            'name': 'Bar Model',
            'version': 'v1.0.0.1',
            'desc': lorem.paragraph(),
            'author': 'Jon Smith',
            'pub_date': '11/2/2018',
            'keywords': ['bar']
        }
    ]
    
    1 回复  |  直到 6 年前
        1
  •  4
  •   eyllanesc Yonghwan Shin    6 年前

    您只需遍历行并使用item()方法获取关键字来获取QListWidgetItem,然后使用itemWidget来获取小部件,使用小部件可以获取关键字并应用过滤器,如果遇到过滤器,它将变为可见,否则必须隐藏

    class MainWindow(QtWidgets.QDialog):
        def __init__(self, data, parent=None):
            super(MainWindow, self).__init__(parent)
            self.data = data
            self.ui = Ui_Main()
            self.ui.setupUi(self)
            self.ui.search_box.textChanged.connect(self.on_textChanged)
            self.set_catalog_data()
    
        def set_catalog_data(self):
            for item in self.data:
                # print(item)
                metadata = MetadataForm(item)
                lst_item = QtWidgets.QListWidgetItem()
                self.ui.catalog_list_wid.insertItem(
                    self.ui.catalog_list_wid.count(),
                    lst_item
                )
                self.ui.catalog_list_wid.setItemWidget(lst_item, metadata)
                lst_item.setSizeHint(metadata.sizeHint())
    
        @QtCore.pyqtSlot(str)
        def on_textChanged(self, text):
            for row in range(self.ui.catalog_list_wid.count()):
                it = self.ui.catalog_list_wid.item(row)
                widget = self.ui.catalog_list_wid.itemWidget(it)
                if text: 
                    it.setHidden(not self.filter(text, widget.keywords))
                else:
                    it.setHidden(False)
    
        def filter(self, text, keywords):
            # foo filter
            # in the example the text must be in keywords
            return text in keywords