Изменение размеров фреймов во вкладке

Появилось желание познакомиться с PyQt5, чтобы сделать интерфейс для нескольких скриптов.

Набросал небольшой GUI, но застрял с размерами фреймов Tasks & Welcome на вкладке Tab1.

Подскажите как можно менять размеры?

Изменение размеров layout

import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import (
    QMainWindow, QWidget, QGridLayout,
    QHBoxLayout, QVBoxLayout, QApplication, QTabWidget, QPushButton, QGroupBox, QLabel
)

MAIN_APP_HEIGHT = 400
MAIN_APP_WIDTH = 700

class MainApplication(QMainWindow):
    def __init__(self):
        super().__init__()

        self.main_grid = None

        self.centralWidget = QWidget()
        self.setCentralWidget(self.centralWidget)

        self.main_app_build()

    def main_app_build(self):

        self.setFixedSize(MAIN_APP_WIDTH, MAIN_APP_HEIGHT)
        self.setWindowTitle("App")

        tab1 = Tab1()
        tab1_layout = QHBoxLayout()
        tab1.setLayout(tab1_layout)

        self.main_tabs = QTabWidget()
        self.main_tabs.addTab(tab1, "Tab 1")

        grid_layout = QGridLayout(self.centralWidget)
        grid_layout.addWidget(self.main_tabs, 0, 0)

class Tab1(QWidget):

    def __init__(self, parent=None):

        super().__init__(parent)

        self.cucm_tasks = Tasks()
        self.cucm_welcome = Welcome()

        grid_layout = QGridLayout(self)
        grid_layout.addWidget(self.cucm_tasks, 0, 0, Qt.AlignLeft)
        grid_layout.addWidget(self.cucm_welcome, 0, 1)


class Tasks(QWidget):

    def __init__(self, parent=None):

        super(Tasks, self).__init__(parent)

        self.widgit_box = QVBoxLayout()

        self.button_admin = QPushButton("Task1")
        self.widgit_box.addWidget(self.button_admin)

        self.button_devices = QPushButton("Task2")
        self.widgit_box.addWidget(self.button_devices)

        self.grid_layout = QGridLayout()
        self.grid_layout.addLayout(self.widgit_box, 0, 0, Qt.AlignTop)

        group_box = QGroupBox()
        group_box.setTitle("&Tasks")
        group_box.setLayout(self.grid_layout)

        h_layout = QHBoxLayout(self)
        h_layout.addWidget(group_box)

class Welcome(QWidget):

    def __init__(self, parent=None):

        super(Welcome, self).__init__(parent)

        self.widgit_box = QVBoxLayout()

        self.widgit_box.addWidget(QLabel("Welcome"))

        self.grid_layout = QGridLayout()
        self.grid_layout.addLayout(self.widgit_box, 0, 0, Qt.AlignCenter)

        group_box = QGroupBox()
        group_box.setTitle("&Welcome")
        group_box.setLayout(self.grid_layout)

        h_layout = QHBoxLayout(self)
        h_layout.addWidget(group_box)


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

Ответы (2 шт):

Автор решения: Александр Корниенко

У класса GridLayout есть метод setRowStretch(row: int, stretch: int) и setColumnStretch(col: int, stretch: int). С помощью этих методов можно контролировать размер ячеек относительно друг друга. Например, если мы сделаем так:

class Tab1(QWidget):

    def __init__(self, parent=None):

        super().__init__(parent)

        self.cucm_tasks = Tasks()
        self.cucm_welcome = Welcome()

        grid_layout = QGridLayout(self)
        grid_layout.addWidget(self.cucm_tasks, 0, 0, Qt.AlignLeft)
        grid_layout.addWidget(self.cucm_welcome, 0, 1)


        #Изменения
        grid_layout.setColumnStretch(0, 1)
        grid_layout.setColumnStretch(1, 5)

, тогда отношение размера первой ячейки и второй ячейки по горизонтали будет равно 1:5. И в результате получится вот так: Результат с setRowStretch()

Документация класса QGridLayout для Qt5 доступна здесь.

→ Ссылка
Автор решения: S. Nick

Я немного упорядочил ваш код. Если что-то не понятно - спросите.

Идея у @АлександрКорниенко правильная, но вы немного перемудрили с менеджерами компоновки и даже с этими правками получаем ошибку:

QWidget::setLayout: Attempting to set QLayout "" on Tab1 "", which already has a layout

import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import (
    QMainWindow, QWidget, QGridLayout,
    QHBoxLayout, QVBoxLayout, QApplication, 
    QTabWidget, QPushButton, QGroupBox, QLabel
)

MAIN_APP_HEIGHT = 400
MAIN_APP_WIDTH = 700


class Welcome(QGroupBox):                                    # - QWidget
    def __init__(self, parent=None):
        super(Welcome, self).__init__(parent)
        self.setStyleSheet('background-color: #aaf5f5;')
        self.setTitle("&Welcome")
        
        self.grid_layout = QGridLayout(self)
        self.grid_layout.addWidget(
            QLabel("<h1>Welcome</h1>"), 0, 0, Qt.AlignCenter)


class Tasks(QGroupBox):                                    # - QWidget
    def __init__(self, parent=None):
        super(Tasks, self).__init__(parent)
        self.setStyleSheet('background-color: #aaaaff;')
        self.setTitle("&Tasks")

        self.button_admin = QPushButton("Task1")
        self.button_devices = QPushButton("Task2")
       
        self.widgit_box = QVBoxLayout(self)                  
        self.widgit_box.addWidget(self.button_admin)
        self.widgit_box.addWidget(self.button_devices)
        self.widgit_box.addStretch(stretch=1)


class Tab1(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setStyleSheet('background-color: #ffaabd;')

        self.cucm_tasks = Tasks()
        self.cucm_welcome = Welcome()

        grid_layout = QHBoxLayout(self)       
        grid_layout.addWidget(self.cucm_tasks, stretch=1) 
        grid_layout.addWidget(self.cucm_welcome, stretch=5) 


class MainApplication(QMainWindow):
    def __init__(self):
        super().__init__()
        self.centralWidget = QWidget()
        self.setCentralWidget(self.centralWidget)

#        self.setFixedSize(MAIN_APP_WIDTH, MAIN_APP_HEIGHT)
        self.resize(MAIN_APP_WIDTH, MAIN_APP_HEIGHT)
        self.setWindowTitle("App")

        tab1 = Tab1()
        
        self.main_tabs = QTabWidget()
        self.main_tabs.setStyleSheet('background-color: #ccffbd;') 
        self.main_tabs.addTab(tab1, "Tab 1")
        self.main_tabs.addTab(QLabel('Htllo world'), "Tab 2")
        
        grid_layout = QGridLayout(self.centralWidget)
        grid_layout.addWidget(self.main_tabs)
      

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

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

→ Ссылка