【问题标题】:Search/Filter custom Widgets for QListWidget搜索/过滤 QListWidget 的自定义小部件
【发布时间】:2019-04-09 00:33:34
【问题描述】:

如何在 QListWidget 中搜索/过滤自定义小部件?

例如,我有一个自定义表单小部件,

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())

在我的MainWindow 中,我的 UI 有一个名为 self.ui.search_box 的 QLineEdit,如何根据 Metadata 类的关键字属性过滤我的自定义 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']
    }
]

【问题讨论】:

    标签: python pyqt pyqt5 qlistwidget


    【解决方案1】:

    您只需要遍历行并使用 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
    

    【讨论】:

      猜你喜欢
      • 2014-07-14
      • 1970-01-01
      • 2018-04-05
      • 2012-07-21
      • 1970-01-01
      • 2018-04-20
      • 1970-01-01
      • 1970-01-01
      • 2013-01-21
      相关资源
      最近更新 更多