Search/Filter QListWidget 的自定义小部件
Search/Filter custom Widgets for QListWidget
如何在 QListWidget 中 search/filter 自定义小部件?
例如,我有一个自定义表单小部件,
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,我如何根据我的元数据 [=29] 的关键字属性过滤我的自定义 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
如何在 QListWidget 中 search/filter 自定义小部件?
例如,我有一个自定义表单小部件,
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,我如何根据我的元数据 [=29] 的关键字属性过滤我的自定义 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