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

Python 搜索/筛选QListWidget的自定义小部件,python,pyqt,pyqt5,qlistwidget,Python,Pyqt,Pyqt5,Qlistwidget,如何在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)

如何在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']))
我可以将这些添加到我的
main窗口

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())
在我的
main窗口中
我的UI有一个名为
self.UI.search\u框
的QLineEdit,我如何根据元数据类的关键字属性筛选我的自定义
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']
    }
]

您只需迭代行并使用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