Изменение размеров фреймов во вкладке
Появилось желание познакомиться с PyQt5, чтобы сделать интерфейс для нескольких скриптов.
Набросал небольшой GUI, но застрял с размерами фреймов Tasks & Welcome на вкладке Tab1.
Подскажите как можно менять размеры?
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. И в результате получится вот так:

Документация класса QGridLayout для Qt5 доступна здесь.
Я немного упорядочил ваш код. Если что-то не понятно - спросите.
Идея у @АлександрКорниенко правильная, но вы немного перемудрили с менеджерами компоновки и даже с этими правками получаем ошибку:
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_())

