添加到 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、实例、方法和实例。
这是我的 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
.
结果是每次创建一个新的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、实例、方法和实例。