添加到 QVBoxLayout (PyQt5) 时如何停止 QFrames 加入

How can I stop QFrames joining when added into a QVBoxLayout (PyQt5)

这是我的 qframe 对象

class PlaylistItem(QFrame):
    layout = QVBoxLayout()
    def __init__(self, name, filename):
        super(PlaylistItem, self).__init__()
        self.name = name
        self.file = filename
        self.widgetUi()

    def widgetUi(self):
        self.setLayout(self.layout)
        self.setStyleSheet("QFrame{background-color: grey; border-radius: 10}")
        layout = self.layout
        nlab = QLabel(self.name)
        layout.addWidget(nlab)
        buttons = QHBoxLayout()
        layout.addLayout(buttons)
        playbut = QPushButton("Play")
        rembut = QPushButton("Remove")
        buttons.addWidget(playbut)
        buttons.addWidget(rembut)

这是我的滚动区域,在小部件中有一个 vboxlayout

self.playlist = QScrollArea()
self.playlist.setWidgetResizable(True)
self.playlistwidget = QWidget()
self.playlistbox = QVBoxLayout()
self.playlistwidget.setLayout(self.playlistbox)
self.playlist.setWidget(self.playlistwidget)

这里我将 qframes 添加到 vboxlayout

for name in range(10):
    but = PlaylistItem("Test Song"+str(name), "test")
    self.playlistbox.insertWidget(self.playlistbox.count()-1, but)

这是我的结果

我不希望所有的 qframes 加入。我希望它们在自己的灰色圆角矩形 bg

中作为单独的 qframes

布局应该是 实例 属性,而您只创建一个布局作为 class 属性 ,这意味着 same 布局对于 PlaylistItem.

的每个新实例都是 shared

结果是每次创建一个新的PlaylistItem时,以前的内容都会重新父级化到新的。在 for 循环结束时,您将拥有 9 个完全空的 QFrames,而最后一个 QFrames 将取而代之的是所有先前创建的标签和按钮。这也是框架顶部空白较大的原因:space 实际上是(现在)空框架之间的间距之和。

您在使用 class 属性时应该更加小心,因为它们始终在 所有实例之间共享 (除非它们被实例属性覆盖)。

class PlaylistItem(QFrame):
    # ...
    def widgetUi(self):
        # the following line automatically sets the layout on the current
        # widget instance, so you don't need to call `setLayout()`
        layout = QVBoxLayout(self)

        # values should always specify units, even if `px` is often assumed
        self.setStyleSheet("""
            QFrame {
                background-color: grey;
                border-radius: 10px;
            }
        """)
        nlab = QLabel(self.name)
        layout.addWidget(nlab)
        buttons = QHBoxLayout()
        layout.addLayout(buttons)
        playbut = QPushButton("Play")
        rembut = QPushButton("Remove")
        buttons.addWidget(playbut)
        buttons.addWidget(rembut)

我建议你多研究一下classes、实例、方法和实例。