Как организовать сложную структуру виджетов в PyQt5?
Необходимо добиться положения виджетов как на картинке:
Пытаюсь реализовать это на PyQt5, но получается не то, что нужно:
from PyQt5.QtWidgets import (QWidget, QLabel,QScrollArea,
QHBoxLayout, QVBoxLayout, QMainWindow)
from PyQt5.QtCore import Qt
from PyQt5 import QtWidgets
import sys
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
def initUI(self, mas):
self.scroll = QScrollArea()
self.widget2 = QWidget()
self.widget3 = QWidget()
self.widget4 = QWidget()
self.teemWidget = QWidget()
self.teemWidgetLayout = QHBoxLayout(self.teemWidget)
self.topWidget = QWidget()
self.topWidgetLayout = QVBoxLayout(self.topWidget)
self.vbox_mother = QHBoxLayout()
self.vbox_first_teem = QVBoxLayout()
self.vbox_second_teem = QVBoxLayout()
self.vbox_header = QVBoxLayout()
self.mas = [["БАСКЕТБОЛ", "Команда 1", "Команда 2", "Команда 3", "Команда 4"],["ХОККЕЙ", "Команда 1", "Команда 2"]]
for i in range(len(self.mas)):
object3 = QLabel(((self.mas[i][0])))
object3.setAlignment(Qt.AlignLeft)
self.vbox_header.addWidget(object3)
for j in range(len(mas[i])-1):
object = QLabel(((self.mas[i][j+1])))
object.setAlignment(Qt.AlignRight)
object.setFixedHeight(16)
self.vbox_first_teem.addWidget(object)
object2 = QLabel(((self.mas[i][j+1])))
object2.setAlignment(Qt.AlignLeft)
object2.setFixedHeight(16)
self.vbox_second_teem.addWidget(object2)
self.widget2.setLayout(self.vbox_first_teem)
self.widget3.setLayout(self.vbox_second_teem)
self.teemWidgetLayout.addWidget(self.widget2)
self.teemWidgetLayout.addWidget(self.widget3)
self.widget2.setFixedWidth(150)
self.widget3.setFixedWidth(150)
self.widget4.setLayout(self.vbox_header)
self.topWidgetLayout.addWidget(self.widget4)
self.topWidgetLayout.addWidget(self.teemWidget)
self.scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
self.scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.scroll.setWidgetResizable(True)
self.scroll.setWidget(self.topWidget)
self.setCentralWidget(self.scroll)
self.setGeometry(600, 100, 1000, 900)
self.show()
return
def main():
app = QtWidgets.QApplication(sys.argv)
main = MainWindow()
main.initUI()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
Подскажите в чём ошибка?
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Обратите внимание:
self.mas- это уже словарь;- я использую ОДИН менеджер компоновки -
QGridLayout; - я не почувствовал необходимость использования
QScrollArea, если что, добавите.
import sys
from PyQt5.QtWidgets import (QWidget, QLabel,QScrollArea, QGridLayout,
QHBoxLayout, QVBoxLayout, QMainWindow, QApplication)
from PyQt5.QtCore import Qt
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.centrawidget = QWidget(self)
self.centrawidget.setObjectName("centrawidget")
self.setCentralWidget(self.centrawidget)
self.layout = QGridLayout(self.centrawidget)
self.mas = {
"БАСКЕТБОЛ": ["Команда 1", "Команда 2", "Команда 3", "Команда 4"],
"ХОККЕЙ": ["Команда 11", "Команда 22"],
"Футбол": ["Команда 111", "Команда 222", "Команда 333"],
}
row = 1
column = 1
for game_name, team_name in self.mas.items():
_game_name = QLabel(game_name)
_game_name.setStyleSheet("""
background-color: #1F1F41;
color: #FFF;
font-size: 35px;
border: 5px solid #ff009B;
min-height: 100px;
min-width: 500px;
""")
_game_name.setAlignment(Qt.AlignCenter)
self.layout.addWidget(_game_name, row, column, 1, 2)
row += 1
_column = 2
for step, name in enumerate(team_name):
label = QLabel(name, objectName=name.lower())
label.setAlignment(Qt.AlignCenter)
label.setStyleSheet("""
background-color: #00FF7F;
color: #8B4513;
font-size: 25px;
min-width: 180px;
border: 3px solid #191970;
""")
_row = step // _column + row
_col = step % _column + 1
self.layout.addWidget(label, _row, _col,
alignment=Qt.AlignLeft if _col % 2 else Qt.AlignRight)
row = _row + 1
self.layout.setColumnStretch(0, 1)
self.layout.setColumnStretch(3, 1)
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MainWindow()
w.resize(500, 600)
w.show()
sys.exit(app.exec_())

