首页 > 解决方案 > 添加到 QVBoxLayout (PyQt5) 时如何停止 QFrame 加入

问题描述

这是我的 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)

这是我的结果

我明白了

我不希望所有的 qframe 都加入。我希望它们在自己的灰色圆角矩形 bg 中作为单独的 qframe

标签: pythonuser-interfacepyqtpyqt5

解决方案


布局应该是一个实例属性,而您只创建一个布局作为类属性,这意味着相同的布局正在为PlaylistItem.

结果是每次创建一个新的 PlaylistItem 时,前一个的内容都会重新分配给新的。在 for 循环结束时,您将拥有 9 个完全空的 QFrame,而最后一个将拥有之前创建的所有标签和按钮。这也是框架顶部有大边距的原因:该空间实际上是(现在)空框架之间的间距之和。

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

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)

我建议你对类、实例、方法和实例做更多的研究。


推荐阅读