Python PyQt5使用布局向小部件子类添加其他小部件?
我正在尝试将一个Python PyQt5使用布局向小部件子类添加其他小部件?,python,pyqt,pyqt5,Python,Pyqt,Pyqt5,我正在尝试将一个QListWidget子类化,并在上面添加一个搜索框。我知道我可以通过子类化QWidget并为其提供一个包含QListWidget和QLineEdit的布局来创建它,但我更希望它是QListWidget的一个直接子类,这样它就可以轻松地替换代码中现有的QListWidget,并保留父小部件可能调用的所有继承方法 这是我的尝试,但我不确定如何将QListWidget与QLineEdit,layout一起放入布局中。addWidget(self)不起作用 import re from
QListWidget
子类化,并在上面添加一个搜索框。我知道我可以通过子类化QWidget
并为其提供一个包含QListWidget
和QLineEdit
的布局来创建它,但我更希望它是QListWidget
的一个直接子类,这样它就可以轻松地替换代码中现有的QListWidget
,并保留父小部件可能调用的所有继承方法
这是我的尝试,但我不确定如何将QListWidget
与QLineEdit
,layout一起放入布局中。addWidget(self)
不起作用
import re
from PyQt5 import QtCore, QtGui, QtWidgets
class SearchableListWidget(QtWidgets.QListWidget):
def __init__(self, items, parent=None):
super().__init__(parent=parent)
self.initial_items = items
self.set_items(items)
self.search_box = QtWidgets.QLineEdit()
self.search_box.textChanged.connect(self.filter)
layout = QtWidgets.QVBoxLayout()
layout.addWidget(self.search_box)
self.setLayout(layout)
def filter(self):
filtered_items = [item for item in self.initial_items
if re.search(self.search_box.text().lower(), item.lower())]
self.set_items(filtered_items)
def get_items(self):
return [str(self.item(i).text()) for i in range(self.count())]
def set_items(self, items):
self.clear()
for name in items:
self.addItem(name)
if __name__ == "__main__":
import sys
from PyQt5.QtWidgets import QApplication
app = QApplication(sys.argv)
test = SearchableListWidget(['a', 'b', 'c'])
test.show()
sys.exit(app.exec_())
我得到的:我想要的:
问题在于程序的结构:窗口是SearchableListWidget,这是一个QListWidget,您可以通过布局放置QLineEdit,但正确的做法是创建一个类,该类继承自QWidget等容器,并通过QVBoxLayout垂直放置QLineEdit和QListWidget:
import re
from PyQt5 import QtCore, QtGui, QtWidgets
class SearchableWidget(QtWidgets.QWidget):
def __init__(self, items, parent=None):
super().__init__(parent)
self.search_box = QtWidgets.QLineEdit()
self.search_box.textChanged.connect(self.filter)
self.list_widget = QtWidgets.QListWidget()
layout = QtWidgets.QVBoxLayout(self)
layout.addWidget(self.search_box)
layout.addWidget(self.list_widget)
self.initial_items = items
self.set_items(items)
def filter(self):
filtered_items = [
item
for item in self.initial_items
if re.search(self.search_box.text().lower(), item.lower())
]
self.set_items(filtered_items)
def get_items(self):
return [
str(self.list_widget.item(i).text())
for i in range(self.list_widget.count())
]
def set_items(self, items):
self.list_widget.clear()
for name in items:
self.list_widget.addItem(name)
if __name__ == "__main__":
import sys
from PyQt5.QtWidgets import QApplication
app = QApplication(sys.argv)
test = SearchableWidget(["a", "b", "c"])
test.show()
sys.exit(app.exec_())
我认为OP正在寻找一种方法,将其作为QListWidget的一个直接子类来实现,这样它就可以替代其他列表小部件,也就是说,无需重新实现QListWidget的功能。我这么问是因为我想做同样的事情