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的功能。我这么问是因为我想做同样的事情