python - 添加到 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
解决方案
布局应该是一个实例属性,而您只创建一个布局作为类属性,这意味着相同的布局正在为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)
我建议你对类、实例、方法和实例做更多的研究。
推荐阅读
- ssis - 如何在 SSIS Pivot 转换中将行发送到错误输出?
- ios - 图像在圆形 UIImageView 中得到压缩
- azure - 使用 ADF 时在 cosmos DB 中序列化数组
- php - 使用 AJAX 更新多个 div
- asp.net-mvc - asp.net MVC 5 使用 javascript AJAX 调用控制器函数
- css - 1px 边框弄乱了 100% 宽度的拆分页面
- c# - 基于日期的两个表的计数
- python - ORA-01722: 无效数字 - 带有 cx_Oracle 的 Python
- python - 如何将 jpeg 大小减小到“所需大小”?
- c# - 返回未按预期退出递归方法 - C#