Работа с Central Widget в PyQt, настройка выравнивание виджетов в QScrollArea

Рейтинг: 1Ответов: 1Опубликовано: 08.06.2023

Занимаюсь разработкой небольшого приложения и столкнулся со следующей проблемой:
Из-за большого количества элементов необходимо добавить 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_())

введите сюда описание изображения

введите сюда описание изображения