Как оптимизировать создание контейнеров?
В теле цикла мне нужно создать довольно много контейнеров с абсолютно одинаковыми характеристиками, но разным наполнением.
Сейчас это происходит в три этапа:
- Создается
QWidget - Задаются определенные внешние характеристики для
QWidget - Создается новый контейнер, который привязывается к
QWidget
Цикл повторяется некоторое количество раз (всегда разное).
Мне стало интересно, может быть, можно заранее сделать шаблон для контейнера и не пересоздавать его каждый раз снова? Если это возможно, пожалуйста, помогите мне оптимизировать код.
from PyQt5 import QtCore, QtWidgets, QtGui
class MyWindow(QtWidgets.QWidget):
def __init__(self, parent = None):
super().__init__(parent)
self.main_box = QtWidgets.QVBoxLayout(self)
self.make()
def make(self):
for i in range(0, 5):
container = QtWidgets.QWidget()
container.setStyleSheet(box_qss)
container.setFixedHeight(50)
song_box = QtWidgets.QHBoxLayout(container)
self.main_box.addWidget(container)
box_qss = '''QWidget {
background-color: #1F252F;
border-radius: 5px;
}'''
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
window = MyWindow()
window.setWindowTitle(' ')
window.show()
sys.exit(app.exec_())
UPD: В каждом контейнере будет кнопка и две надписи(текст каждой надписи будет отличаться):
from PyQt5 import QtCore, QtWidgets, QtGui
class MyWindow(QtWidgets.QWidget):
def __init__(self, parent = None):
super().__init__(parent)
self.main_box = QtWidgets.QVBoxLayout(self)
self.make()
def make(self):
for i in range(0, 5):
container = QtWidgets.QWidget()
container.setStyleSheet(box_qss)
container.setFixedHeight(50)
song_box = QtWidgets.QHBoxLayout(container)
self.main_box.addWidget(container)
btn = QtWidgets.QPushButton('Button')
btn.setStyleSheet(btn_qss)
song_box.addWidget(btn)
label = QtWidgets.QLabel('Text')
label.setStyleSheet(label_qss)
song_box.addWidget(label)
duration = QtWidgets.QLabel('00:00')
duration.setStyleSheet(label_qss)
song_box.addWidget(duration)
box_qss = '''QWidget {
background-color: #1F252F;
border-radius: 5px;
}'''
label_qss = '''QLabel {
color: white;
}'''
btn_qss = '''QPushButton {
background-color: #3A4256;
color: white;
}'''
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
window = MyWindow()
window.setWindowTitle(' ')
window.show()
sys.exit(app.exec_())
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Я бы предложил попробовать так:
from random import randint
from PyQt5 import QtCore, QtWidgets, QtGui
class Widget(QtWidgets.QWidget):
def __init__(self, list_album, parent=None):
super(Widget, self).__init__(parent)
self.song_box = QtWidgets.QGridLayout(self)
self.song_box.setContentsMargins(0, 0, 0, 0)
for i, text in enumerate(list_album):
button = QtWidgets.QPushButton(f"Button {i+1}",
minimumWidth=70,
minimumHeight=50,
clicked=lambda ch, t=text[0]: self.onButton(t))
label = QtWidgets.QLabel(
f'{text[0]} - {text[1]}', alignment = QtCore.Qt.AlignCenter)
self.song_box.addWidget(button, i, 0)
self.song_box.addWidget(label, i, 1)
def onButton(self, text):
print(f"Выбрали песню {text}")
class MyWindow(QtWidgets.QWidget):
def __init__(self, music_album, parent = None):
super(MyWindow,self).__init__(parent)
self.music_album = music_album
self.container = None
self.main_box = QtWidgets.QGridLayout(self)
self.button = QtWidgets.QPushButton('Выберите Music Album', minimumHeight=50, clicked=self.make)
self.main_box.addWidget(self.button, 111, 0, QtCore.Qt.AlignBottom)
def make(self):
num_album = randint(1, len(self.music_album)) # выбираем случайный альбом
list_album = self.music_album[num_album]
if self.container:
self.container.deleteLater()
self.container = Widget(list_album, self)
self.main_box.addWidget(self.container, 1, 0)
qss = '''
QWidget {
background-color: #1F252F;
border-radius: 5px;
}
QLabel {
color: white;
}
QPushButton {
background-color: #3A4256;
color: white;
}
'''
# Какие-то альбомы с какими-то песнями
music_album = {
1: (('Text1', '00:00'), ('Text2', '00:02'), ('Text3', '00:03'), ('Text4', '00:04'), ('Text5', '00:05'),),
2: (('Text21', '00:00'), ('Text22', '00:02'), ('Text23', '00:03'), ('Text24', '00:03'),),
3: (('Text31', '00:00'), ('Text32', '00:02'), ('Text33', '00:03'), ),
4: (('Text41', '00:00'), ('Text42', '00:02'),),
5: (('Text51', '00:00'),),
}
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
app.setStyleSheet(qss) # <<<=====<
window = MyWindow(music_album)
window.setWindowTitle(' ')
window.resize(250, 370)
window.show()
sys.exit(app.exec_())
Если есть вопросы, пишите, я прокомментирую.
