Как сделать адаптивное окно в PyQt?

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

Я делаю приложение-викторину на PyQt5. Я добавил текст, кнопку и фоновое изображение, но дальше встал вопрос как сделать окно адаптивным?

Я много гуглил, как в рунете так и в англоязычном интернете и ютюбе, но ничего не нашел.

main.py:

from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QApplication
from PyQt5.QtGui import QPixmap
import sys


class QuizApplication(QMainWindow):
    def __init__(self):
        super(QuizApplication, self).__init__()

        self.setWindowTitle("Quiz")
        self.setGeometry(600, 100, 648, 500)

        self.pixmap = QPixmap("background_image.jpg")
        self.background_label = QtWidgets.QLabel(self)
        self.background_label.setPixmap(self.pixmap)
        self.background_label.adjustSize()

        self.welcome_label = QtWidgets.QLabel(self)
        self.welcome_label.move(100, 0)
        self.welcome_label.setText("Это будет викторина по истории, философии и обществознанию")
        self.welcome_label.adjustSize()

        self.start_button = QtWidgets.QPushButton(self)
        self.start_button.move(220, 20)
        self.start_button.setText("Нажмите чтобы начать!")
        self.start_button.adjustSize()

def aplication_setup():
    app = QApplication(sys.argv)
    window = QuizApplication()

    window.show()
    sys.exit(app.exec_())


if __name__ == "__main__":
    aplication_setup()

Это то что у меня получилось

Ответы

▲ 2Принят

Вам надо изучить Qt Main Window Framework

Примечание. Создание главного окна без центрального виджета не поддерживается. У вас должен быть центральный виджет, даже если это просто заполнитель.
...


Научитесь использовать менеджеры компоновки: Layout Management
...

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, \
    QPushButton, QWidget, QVBoxLayout
from PyQt5.QtGui import QPixmap
from PyQt5.QtCore import Qt


class QuizApplication(QMainWindow):
    def __init__(self):
        super(QuizApplication, self).__init__()
        self.setWindowTitle("Quiz")
# ?        self.setGeometry(600, 100, 648, 500)

        self.centralwidget = QWidget()                               # !!! +++
        self.centralwidget.setObjectName("centralwidget")            # !!! +++
        self.setCentralWidget(self.centralwidget)                    # !!! +++

        self.pixmap = QPixmap("head3.png")
        self.background_label = QLabel(self)
        self.background_label.setObjectName("background_label")      # +++
        self.background_label.setPixmap(self.pixmap)
#         self.background_label.adjustSize()

        self.welcome_label = QLabel(self)
        self.welcome_label.setObjectName("welcome_label")            # +++
        self.welcome_label.setAlignment(Qt.AlignCenter)              # +++
        self.welcome_label.setWordWrap(True)                         # +++
#        self.welcome_label.move(100, 0)
        self.welcome_label.setText(
            "Это будет викторина по истории, философии и обществознанию.")
#         self.welcome_label.adjustSize()
        
        self.start_button = QPushButton(self)
        self.start_button.setObjectName("start_button")              # +++      
#        self.start_button.move(220, 20)
        self.start_button.setText("Нажмите чтобы начать!")
#         self.start_button.adjustSize()

# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
        self.verticalLayout = QVBoxLayout(self.centralwidget)
        self.verticalLayout.addWidget(self.welcome_label, alignment=Qt.AlignTop)
        self.verticalLayout.addWidget(self.start_button, alignment=Qt.AlignHCenter|Qt.AlignTop)
        self.verticalLayout.addWidget(self.background_label, 1, alignment = Qt.AlignCenter)


StyleSheet = """
#centralwidget {
    border-image: url(background.png) 0 0 0 0 stretch stretch;
}
#welcome_label {
    font-size: 23px;
    color: #f77;
}
#start_button {
    font-size: 20px;
    color: #ADFF2F;
    background-color: #008000; 
}
"""
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^


if __name__ == "__main__":
    app = QApplication(sys.argv)
    app.setStyleSheet(StyleSheet)                                      # +++ 
    window = QuizApplication()
    window.resize(648, 500)                                            # +
    window.show()
    sys.exit(app.exec_())

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

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

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


background.png

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

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