Зависимость размеров виджетов от изменения размеров окна
Как сделать так, чтобы в зависимости от растягивания или уменьшения окна все остальное также меняло размер?
import sys
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow, QGridLayout
from PyQt5.QtCore import QSize
class Window(QMainWindow): # Создаем класс Window, который наследует все от класса QMainWindow
def __init__(self): # Создаем конструктор
super(Window, self).__init__() # С помощью функции super вызывем конструктор из родительского класса
self.setGeometry(700, 200, 450, 650) # Выбираем отступы, ширу и высоту окна
self.setWindowTitle('КБЖУ') # Указываем название приложения
# self.setFixedSize(QSize(450, 650)) # Устанавливаем фиксированный размер главного окна
self.heading = QtWidgets.QLabel(self) # Создаем заголовок приложения
self.heading.setText('') # Текст в этом заголовке
self.heading.setStyleSheet('background-color: rgb(68, 207, 203);') # Фон заголовка
self.heading.setGeometry(0, 0, 450, 90) # Отступы, ширина и высота заголовка
# Функция которая создает приложение
def aplication():
app = QApplication(sys.argv) # создаем объект в качестве параметра предаём информацию о системе
window = Window() # Создаем объект(Окно приложения) на основе нашего класса Window
window.show() # Метод show показывает созданное окно
sys.exit(app.exec_()) # Корректное закрытие приложения
Ответы (2 шт):
Автор решения: S. Nick
→ Ссылка
Как вариант
import sys
from PyQt5.Qt import *
class Window(QLabel):
def __init__(self):
super(Window, self).__init__()
self.setStyleSheet('background-color: rgb(68, 207, 203);')
self.setText("Hello World")
def paintEvent(self, event):
doc = QTextDocument()
if self.textFormat() == Qt.RichText or \
self.textFormat() == Qt.AutoText and \
Qt.mightBeRichText(self.text()):
doc.setHtml(self.text())
else:
doc.setPlainText(self.text())
frame = doc.rootFrame().frameFormat()
frame.setMargin(0)
doc.rootFrame().setFrameFormat(frame)
scale = min(
self.width() / doc.size().width(),
self.height() / doc.size().height()
)
qp = QPainter(self)
qp.scale(scale, scale)
doc.drawContents(qp, QRectF(self.rect()))
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
w = Window()
w.show()
sys.exit(app.exec_())
Update
import sys
from PyQt5.Qt import *
class Label(QLabel):
def __init__(self):
super(Label, self).__init__()
self.setStyleSheet('background-color: rgb(68, 207, 203);')
self.setText("Hello World")
def paintEvent(self, event):
doc = QTextDocument()
if self.textFormat() == Qt.RichText or \
self.textFormat() == Qt.AutoText and \
Qt.mightBeRichText(self.text()):
doc.setHtml(self.text())
else:
doc.setPlainText(self.text())
frame = doc.rootFrame().frameFormat()
frame.setMargin(0)
doc.rootFrame().setFrameFormat(frame)
scale = min(
self.width() / doc.size().width(),
self.height() / doc.size().height()
)
qp = QPainter(self)
qp.scale(scale, scale)
doc.drawContents(qp, QRectF(self.rect()))
class Window(QMainWindow):
def __init__(self):
super().__init__()
self.centralWidget = QWidget()
self.setCentralWidget(self.centralWidget)
self.label = Label()
self.textEdit = QTextEdit()
self.button = QPushButton('Button')
main_layout = QVBoxLayout(self.centralWidget)
main_layout.addWidget(self.label, 1)
main_layout.addWidget(self.textEdit, 4)
main_layout.addWidget(self.button, 0)
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
w = Window()
w.resize(450, 450)
w.show()
sys.exit(app.exec_())
Автор решения: gil9red
→ Ссылка
Используйте компоновщики Q*Layout (типа QVBoxLayout). Для QMainWindow нужно создать виджет для setCentralWidget и на него размещать виджеты
В качестве примера покажу использование QVBoxLayout и QHBoxLayout
Пример:
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QLabel, QHBoxLayout, QVBoxLayout, QPushButton, QTextEdit
class Window(QMainWindow): # Создаем класс Window, который наследует все от класса QMainWindow
def __init__(self): # Создаем конструктор
super().__init__() # С помощью функции super вызывем конструктор из родительского класса
self.setGeometry(700, 200, 450, 650) # Выбираем отступы, ширу и высоту окна
self.setWindowTitle('КБЖУ') # Указываем название приложения
self.heading = QLabel() # Создаем заголовок приложения
self.heading.setText('Заголовок') # Текст в этом заголовке
self.heading.setStyleSheet('background-color: rgb(68, 207, 203);') # Фон заголовка
self.text_edit = QTextEdit()
self.button_close = QPushButton('Закрыть')
self.button_close.clicked.connect(self.close)
self.button_save = QPushButton('Сохранить')
layout_buttons = QHBoxLayout()
layout_buttons.addWidget(self.button_save)
layout_buttons.addWidget(self.button_close)
main_layout = QVBoxLayout()
main_layout.addWidget(self.heading)
main_layout.addWidget(self.text_edit)
main_layout.addLayout(layout_buttons)
central_widget = QWidget()
central_widget.setLayout(main_layout)
self.setCentralWidget(central_widget)
# Функция которая создает приложение
def main():
app = QApplication(sys.argv) # создаем объект в качестве параметра предаём информацию о системе
window = Window() # Создаем объект(Окно приложения) на основе нашего класса Window
window.show() # Метод show показывает созданное окно
sys.exit(app.exec_()) # Корректное закрытие приложения
if __name__ == '__main__':
main()
Результат:


