有没有一种优雅的方法可以删除 PyQt 中 QScrollArea 中的小部件?

Is there an elegant way to delete a widget in QScrollArea in PyQt?

最近在学习PyQt5,想删除QScrollArea中的一个widget时遇到了问题。有没有一种优雅的方法来访问 QScrollArea 中的元素并在单击该元素中的“删除”按钮时将其删除?感谢您的帮助!

class MyWidget(QWidget):
    def __init__(self, id):
        super().__init__()
        self.layout = QHBoxLayout()
        self.layout.addWidget(QPlainTextEdit(id))
        self.layout.addWidget(QPushButton('Delete'))
        self.setLayout(self.layout)

        # connect options
        connect_options()
    

    def connect_options(self):
        pass


class MyList(QScrollArea):
    def __init__(self):
        super().__init__()
        self.layout = QVBoxLayout()
        self.widget = QWidget()
        for x in range(10):
            self.layout.addWidget(MyWidget(str(x)))
        self.widget.setLayout(self.layout)

        self.setMinimumSize(1024, 500)
        self.setWidget(self.widget)

首先我建议你看一下QListWidget,它会为你提供各种函数来处理这种情况。

对于您的问题,您需要从其父布局中删除小部件,然后将其从 GUI 中删除

class MyWidget(QWidget):
    def __init__(self, id):
       super().__init__()
       self.layout = QHBoxLayout()
       self.layout.addWidget(QPlainTextEdit(id))
       del_btn = QPushButton('Delete') 
       del_btn.clicked.connect(self._delete) # connect the click event to your delete function
       self.layout.addWidget(del_btn)
       self.setLayout(self.layout)

       # connect options
       self.connect_options()


    def connect_options(self):
       pass

    def _delete(self):
       # here you will delete your widget
       parent_layout = self.parent().layout()
       parent_layout.removeWidget(self) # remove the widget from its parent layout
       self.deleteLater() # lets Qt knows it needs to delete this widget from the GUI
       del self