PyQt5 как дать возможность QSplitter изменять размеры QWidget

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

У меня есть простой интерфейс на PyQt5, который состоит из верхней и нижней зоны, разделенных горизонтальной чертой. Мне дать пользователю возможность перемещать эту разделительную полосу вверх и вниз, изменяя, соответственно, размеры верхней и нижней части. Мне подсказали, как это сделать и, в целом, QSplitter работает, но когда я тяну его вверх и он упирается в QWidget, дальнейшее изменение размеров невозможно. Как я могу сделать, чтобы QWidget вел себя так же, как, например, QTableWidget, то есть при изменении размеров просто сворачивался до минимальных размеров и у него появлялся ползунок? Ну или хотя бы без ползунка, чтобы была возможность его частично скрыть.

import sys

from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import *


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.central_widget = QWidget(self)
        self.setGeometry(50, 50, 1300, 700)
        self.setCentralWidget(self.central_widget)
        self.layout_main_window = QVBoxLayout()
        self.central_widget.setLayout(self.layout_main_window)
        #  верхняя часть
        self.frame_top = QFrame()
        self.layout_top = QHBoxLayout()
        self.widget = QWidget()
        self.widget_layout = QVBoxLayout()
        self.widget.setLayout(self.widget_layout)
        for i in range(25):
            self.widget_layout.addWidget(QPushButton('Строка'))

        self.top_table = QTableWidget()
        self.top_table.setRowCount(20)
        self.layout_top.addWidget(self.widget)
        self.layout_top.addWidget(self.top_table)
        self.frame_top.setLayout(self.layout_top)
        #  нижняя часть
        self.frame_bottom = QFrame()
        self.layout_bottom = QVBoxLayout()
        self.bot_table = QTableWidget()
        self.bot_table.setRowCount(20)
        self.layout_bottom.addWidget(self.bot_table)
        self.frame_bottom.setLayout(self.layout_bottom)
        # Splitter
        self.splitter2 = QSplitter(Qt.Vertical)
        self.splitter2.addWidget(self.frame_top)
        self.splitter2.addWidget(self.frame_bottom)
        self.layout_main_window.addWidget(self.splitter2)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main_window = MainWindow()
    main_window.show()
    sys.exit(app.exec_())

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

Ответы

▲ 1Принят

Вы можете установить минимальный размер кнопки и сделать их расширяющимися на максимальный размер:

import sys

from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import *


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.central_widget = QWidget(self)
        self.setGeometry(50, 50, 1300, 700)
        self.setCentralWidget(self.central_widget)
        self.layout_main_window = QVBoxLayout()
        self.central_widget.setLayout(self.layout_main_window)
        #  верхняя часть
        self.frame_top = QFrame()
        self.layout_top = QHBoxLayout()
        self.widget = QWidget()
        self.widget_layout = QVBoxLayout()
        self.widget.setLayout(self.widget_layout)
        for i in range(25):
            button = QPushButton('Строка')
            button.setMinimumSize(1, 1)  # Устанавливаем минимальный размер
            button.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
            self.widget_layout.addWidget(button)
        self.widget_layout.setSpacing(0)  # Устанавливаем расстояние между кнопками
        self.top_table = QTableWidget()
        self.top_table.setRowCount(20)
        self.layout_top.addWidget(self.widget)
        self.layout_top.addWidget(self.top_table)
        self.frame_top.setLayout(self.layout_top)
        #  нижняя часть
        self.frame_bottom = QFrame()
        self.layout_bottom = QVBoxLayout()
        self.bot_table = QTableWidget()
        self.bot_table.setRowCount(20)
        self.layout_bottom.addWidget(self.bot_table)
        self.frame_bottom.setLayout(self.layout_bottom)
        # Splitter
        self.splitter2 = QSplitter(Qt.Vertical)
        self.splitter2.addWidget(self.frame_top)
        self.splitter2.addWidget(self.frame_bottom)
        self.layout_main_window.addWidget(self.splitter2)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main_window = MainWindow()
    main_window.show()
    sys.exit(app.exec_())

Также можно использовать QScrollArea:

import sys

from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import *


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.central_widget = QWidget(self)
        self.setGeometry(50, 50, 1300, 700)
        self.setCentralWidget(self.central_widget)
        self.layout_main_window = QVBoxLayout()
        self.central_widget.setLayout(self.layout_main_window)
        #  верхняя часть
        self.frame_top = QFrame()
        self.layout_top = QHBoxLayout()
        self.widget = QWidget()
        self.widget_layout = QVBoxLayout()
        self.widget.setLayout(self.widget_layout)
        for i in range(25):
            button = QPushButton('Строка')
            self.widget_layout.addWidget(button)
        self.scroll_area = QScrollArea()
        self.scroll_area.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
        self.scroll_area.setWidgetResizable(True)
        self.scroll_area.setWidget(self.widget)
        self.top_table = QTableWidget()
        self.top_table.setRowCount(20)
        self.layout_top.addWidget(self.scroll_area)
        self.layout_top.addWidget(self.top_table)
        self.frame_top.setLayout(self.layout_top)
        #  нижняя часть
        self.frame_bottom = QFrame()
        self.layout_bottom = QVBoxLayout()
        self.bot_table = QTableWidget()
        self.bot_table.setRowCount(20)
        self.layout_bottom.addWidget(self.bot_table)
        self.frame_bottom.setLayout(self.layout_bottom)
        # Splitter
        self.splitter2 = QSplitter(Qt.Vertical)
        self.splitter2.addWidget(self.frame_top)
        self.splitter2.addWidget(self.frame_bottom)
        self.layout_main_window.addWidget(self.splitter2)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main_window = MainWindow()
    main_window.show()
    sys.exit(app.exec_())