Работа с Central Widget в PyQt, настройка выравнивание виджетов в QScrollArea
Занимаюсь разработкой небольшого приложения и столкнулся со следующей проблемой:
Из-за большого количества элементов необходимо добавить ScrollBar'ы, долгое время не мог разобраться, как это сделать, пока не нашел способ через self.setCentralWidget().
Скроллбар появился, но теперь все элементы настроены не как сетка, а тупо выровнены по середине, есть ли возможность исправить это так, чтобы и скроллбары были и геометрия объектов осталась прежней?
Заранее спасибо!
class srok_window(QMainWindow):
def __init__(self):
super(srok_window, self).__init__()
self.setGeometry(30, 30, 1400, 700)
self.setWindowTitle('Synop 0.2')
self.form_layout = QVBoxLayout()
self.widget = QWidget()
self.scroll = QScrollArea()
default_left_value = 0
for city in self.values_of_telegrams:
# Create Label name
name = QLabel(self)
name.setText(self.values_of_telegrams[city][0])
name.setFont(self.general_font)
name.setStyleSheet(self.style_sheet_names)
name.setGeometry(15 + default_left_value, 30, 150, 15)
name.setAlignment(Qt.AlignCenter)
default_left_value += 150
self.form_layout.addWidget(name)
self.widget.setLayout(self.form_layout)
self.scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
self.scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
self.scroll.setWidgetResizable(True)
self.scroll.setWidget(self.widget)
self.setCentralWidget(self.scroll)
Ответы (1 шт):
Пожалуйста, всегда предоставляйте минимально-воспроизводимый пример и лучше рассказывайте\показывайте что вы хотите получить.
Я не уверен что правильно понял то, что вы хотите получить, но как вариант это может выглядеть примерно так:
import sys
import random
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *
class ExampleWidget(QtWidgets.QFrame): # QWidget
def __init__(self):
super().__init__()
self.values_of_telegrams = { # ???
'1': 'Ярославль',
'2': 'Москва',
'3': 'Киев',
'4': 'Нью-Йорк'
}
default_left_value = 0
self.colors = [
'#f00', '#00f', '#0f0', '#ff0',
'#fff', '#ff6000', '#6b00ff', '#f0f']
self.setStyleSheet('background-color: #798C77;') # ???
for i, city in enumerate(self.values_of_telegrams):
name = QLabel(self)
name.setText(self.values_of_telegrams[city][0])
# name.setFont(self.general_font) # ???
color = random.choice(self.colors)
name.setStyleSheet(f'background-color: {color};')
name.setGeometry(15 + default_left_value, 30, 150, 15)
name.setAlignment(Qt.AlignCenter)
default_left_value += 150
def paintEvent(self, e):
qp = QtGui.QPainter(self)
self.drawWidget(qp)
def drawWidget(self, qp):
qp.setPen(QtGui.QColor(255, 0, 0))
qp.setBrush(QtGui.QColor(255, 0, 0))
qp.drawRect(15, 385, 100, 100)
def sizeHint(self): # <--- sizeHint # !!! +++
return QtCore.QSize(800, 500)
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.scrollArea = QScrollArea()
self.setCentralWidget(self.scrollArea)
self.widget = ExampleWidget()
self.scrollArea.setWidget(self.widget) # <--- setWidget
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
w = Example()
w.resize(502, 515)
w.show()
sys.exit(app.exec_())



