Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Python для новичков
  • » PyQt5: Сохранение пропорций всех виджетов при изменении размеров главного окна с использованием Qt Designer [RSS Feed]

#1 Март 25, 2021 20:35:00

Anton_VolAnt
Зарегистрирован: 2021-02-25
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt5: Сохранение пропорций всех виджетов при изменении размеров главного окна с использованием Qt Designer

Делаю форму в Qt Designer с множеством виджетов. Получается все виджеты спозиционированы абсолютно. При изменении размеров главного окна они сохраняют свои положения и размеры также абсолютно.
Долго игрался с Layout'ами и sizePolicy - ничего не выходит. При использовании resizeEvent нужно для каждого виджета прописывать setGeometry, что очень долго и неудобно.
Подскажите пожалуйста оптимальное решение.

main_UI.py

 from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(400, 400)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.stackedWidget = QtWidgets.QStackedWidget(self.centralwidget)
        self.stackedWidget.setGeometry(QtCore.QRect(0, 0, 400, 400))
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.stackedWidget.sizePolicy().hasHeightForWidth())
        self.stackedWidget.setSizePolicy(sizePolicy)
        self.stackedWidget.setObjectName("stackedWidget")
        self.homePage = QtWidgets.QWidget()
        self.homePage.setObjectName("homePage")
        self.widget = QtWidgets.QWidget(self.homePage)
        self.widget.setGeometry(QtCore.QRect(90, 120, 231, 101))
        self.widget.setObjectName("widget")
        self.homePage_HLayout = QtWidgets.QHBoxLayout(self.widget)
        self.homePage_HLayout.setContentsMargins(0, 0, 0, 0)
        self.homePage_HLayout.setObjectName("homePage_HLayout")
        self.page1_pushButton1 = QtWidgets.QPushButton(self.widget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.page1_pushButton1.sizePolicy().hasHeightForWidth())
        self.page1_pushButton1.setSizePolicy(sizePolicy)
        self.page1_pushButton1.setObjectName("page1_pushButton1")
        self.homePage_HLayout.addWidget(self.page1_pushButton1)
        self.page2_pushButton1 = QtWidgets.QPushButton(self.widget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.page2_pushButton1.sizePolicy().hasHeightForWidth())
        self.page2_pushButton1.setSizePolicy(sizePolicy)
        self.page2_pushButton1.setObjectName("page2_pushButton1")
        self.homePage_HLayout.addWidget(self.page2_pushButton1)
        self.stackedWidget.addWidget(self.homePage)
        self.mainPage = QtWidgets.QWidget()
        self.mainPage.setObjectName("mainPage")
        self.subStackedWidget = QtWidgets.QStackedWidget(self.mainPage)
        self.subStackedWidget.setGeometry(QtCore.QRect(10, 60, 381, 291))
        self.subStackedWidget.setToolTip("")
        self.subStackedWidget.setAccessibleName("")
        self.subStackedWidget.setAccessibleDescription("")
        self.subStackedWidget.setObjectName("subStackedWidget")
        self.subPage1 = QtWidgets.QWidget()
        self.subPage1.setObjectName("subPage1")
        self.subSubStackedWidget = QtWidgets.QStackedWidget(self.subPage1)
        self.subSubStackedWidget.setGeometry(QtCore.QRect(110, 50, 261, 181))
        self.subSubStackedWidget.setObjectName("subSubStackedWidget")
        self.subSubPage1 = QtWidgets.QWidget()
        self.subSubPage1.setObjectName("subSubPage1")
        self.subSubPage1_someWidget = QtWidgets.QWidget(self.subSubPage1)
        self.subSubPage1_someWidget.setGeometry(QtCore.QRect(40, 60, 181, 61))
        self.subSubPage1_someWidget.setObjectName("subSubPage1_someWidget")
        self.subSubPage1_someLabel = QtWidgets.QLabel(self.subSubPage1_someWidget)
        self.subSubPage1_someLabel.setGeometry(QtCore.QRect(20, 10, 131, 41))
        self.subSubPage1_someLabel.setObjectName("subSubPage1_someLabel")
        self.subSubStackedWidget.addWidget(self.subSubPage1)
        self.subSubPage2 = QtWidgets.QWidget()
        self.subSubPage2.setObjectName("subSubPage2")
        self.subSubPage2_someWidget = QtWidgets.QWidget(self.subSubPage2)
        self.subSubPage2_someWidget.setGeometry(QtCore.QRect(40, 60, 181, 61))
        self.subSubPage2_someWidget.setStyleSheet("background-color: rgb(0, 255, 0);")
        self.subSubPage2_someWidget.setObjectName("subSubPage2_someWidget")
        self.subSubPage2_someLabel = QtWidgets.QLabel(self.subSubPage2_someWidget)
        self.subSubPage2_someLabel.setGeometry(QtCore.QRect(20, 10, 131, 41))
        self.subSubPage2_someLabel.setObjectName("subSubPage2_someLabel")
        self.subSubStackedWidget.addWidget(self.subSubPage2)
        self.subPage1_someWidget = QtWidgets.QWidget(self.subPage1)
        self.subPage1_someWidget.setGeometry(QtCore.QRect(110, 230, 271, 61))
        self.subPage1_someWidget.setStyleSheet("background-color: rgb(170, 255, 255);")
        self.subPage1_someWidget.setObjectName("subPage1_someWidget")
        self.subPage1_someLabel = QtWidgets.QLabel(self.subPage1_someWidget)
        self.subPage1_someLabel.setGeometry(QtCore.QRect(70, 10, 131, 41))
        self.subPage1_someLabel.setObjectName("subPage1_someLabel")
        self.widget1 = QtWidgets.QWidget(self.subPage1)
        self.widget1.setGeometry(QtCore.QRect(10, 10, 91, 281))
        self.widget1.setObjectName("widget1")
        self.subPage1_VLayout = QtWidgets.QVBoxLayout(self.widget1)
        self.subPage1_VLayout.setContentsMargins(0, 0, 0, 0)
        self.subPage1_VLayout.setObjectName("subPage1_VLayout")
        self.subPage1_HLayout1 = QtWidgets.QHBoxLayout()
        self.subPage1_HLayout1.setObjectName("subPage1_HLayout1")
        self.search_lineEdit = QtWidgets.QLineEdit(self.widget1)
        self.search_lineEdit.setToolTip("")
        self.search_lineEdit.setStatusTip("")
        self.search_lineEdit.setWhatsThis("")
        self.search_lineEdit.setAccessibleName("")
        self.search_lineEdit.setText("")
        self.search_lineEdit.setObjectName("search_lineEdit")
        self.subPage1_HLayout1.addWidget(self.search_lineEdit)
        self.search_pushButton = QtWidgets.QPushButton(self.widget1)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.search_pushButton.sizePolicy().hasHeightForWidth())
        self.search_pushButton.setSizePolicy(sizePolicy)
        self.search_pushButton.setMaximumSize(QtCore.QSize(25, 25))
        font = QtGui.QFont()
        font.setPointSize(10)
        self.search_pushButton.setFont(font)
        self.search_pushButton.setObjectName("search_pushButton")
        self.subPage1_HLayout1.addWidget(self.search_pushButton)
        self.subPage1_VLayout.addLayout(self.subPage1_HLayout1)
        self.search_listView = QtWidgets.QListView(self.widget1)
        self.search_listView.setObjectName("search_listView")
        self.subPage1_VLayout.addWidget(self.search_listView)
        self.widget2 = QtWidgets.QWidget(self.subPage1)
        self.widget2.setGeometry(QtCore.QRect(110, 10, 271, 31))
        self.widget2.setObjectName("widget2")
        self.subPage1_HLayout2_2 = QtWidgets.QHBoxLayout(self.widget2)
        self.subPage1_HLayout2_2.setContentsMargins(0, 0, 0, 0)
        self.subPage1_HLayout2_2.setObjectName("subPage1_HLayout2_2")
        self.subPage1_pushButton = QtWidgets.QPushButton(self.widget2)
        self.subPage1_pushButton.setObjectName("subPage1_pushButton")
        self.subPage1_HLayout2_2.addWidget(self.subPage1_pushButton)
        self.subPage2_pushButton = QtWidgets.QPushButton(self.widget2)
        self.subPage2_pushButton.setObjectName("subPage2_pushButton")
        self.subPage1_HLayout2_2.addWidget(self.subPage2_pushButton)
        self.subStackedWidget.addWidget(self.subPage1)
        self.subPage2 = QtWidgets.QWidget()
        self.subPage2.setObjectName("subPage2")
        self.subPage2_someWidget = QtWidgets.QWidget(self.subPage2)
        self.subPage2_someWidget.setGeometry(QtCore.QRect(70, 50, 261, 171))
        self.subPage2_someWidget.setStyleSheet("background-color: rgb(170, 255, 127);")
        self.subPage2_someWidget.setObjectName("subPage2_someWidget")
        self.subPage2_someLabel = QtWidgets.QLabel(self.subPage2_someWidget)
        self.subPage2_someLabel.setGeometry(QtCore.QRect(80, 60, 131, 41))
        self.subPage2_someLabel.setObjectName("subPage2_someLabel")
        self.subStackedWidget.addWidget(self.subPage2)
        self.widget3 = QtWidgets.QWidget(self.mainPage)
        self.widget3.setGeometry(QtCore.QRect(10, 0, 381, 51))
        self.widget3.setObjectName("widget3")
        self.mainPage_HLayout = QtWidgets.QHBoxLayout(self.widget3)
        self.mainPage_HLayout.setContentsMargins(0, 0, 0, 0)
        self.mainPage_HLayout.setObjectName("mainPage_HLayout")
        self.page1_pushButton2 = QtWidgets.QPushButton(self.widget3)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.page1_pushButton2.sizePolicy().hasHeightForWidth())
        self.page1_pushButton2.setSizePolicy(sizePolicy)
        self.page1_pushButton2.setObjectName("page1_pushButton2")
        self.mainPage_HLayout.addWidget(self.page1_pushButton2)
        self.page2_pushButton2 = QtWidgets.QPushButton(self.widget3)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.page2_pushButton2.sizePolicy().hasHeightForWidth())
        self.page2_pushButton2.setSizePolicy(sizePolicy)
        self.page2_pushButton2.setObjectName("page2_pushButton2")
        self.mainPage_HLayout.addWidget(self.page2_pushButton2)
        self.home_pushButton = QtWidgets.QPushButton(self.widget3)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.home_pushButton.sizePolicy().hasHeightForWidth())
        self.home_pushButton.setSizePolicy(sizePolicy)
        self.home_pushButton.setObjectName("home_pushButton")
        self.mainPage_HLayout.addWidget(self.home_pushButton)
        self.stackedWidget.addWidget(self.mainPage)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 400, 21))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.retranslateUi(MainWindow)
        self.stackedWidget.setCurrentIndex(0)
        self.subStackedWidget.setCurrentIndex(0)
        self.subSubStackedWidget.setCurrentIndex(0)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.page1_pushButton1.setText(_translate("MainWindow", "Page 1"))
        self.page2_pushButton1.setText(_translate("MainWindow", "Page 2"))
        self.subSubPage1_someLabel.setText(_translate("MainWindow", "Some Widget SubPage 1"))
        self.subSubPage2_someLabel.setText(_translate("MainWindow", "Some Widget SubPage 2"))
        self.subPage1_someLabel.setText(_translate("MainWindow", "Some Widget Page 1"))
        self.search_lineEdit.setPlaceholderText(_translate("MainWindow", "Search"))
        self.search_pushButton.setText(_translate("MainWindow", "►"))
        self.subPage1_pushButton.setText(_translate("MainWindow", "Sub Page1"))
        self.subPage2_pushButton.setText(_translate("MainWindow", "Sub page 2"))
        self.subPage2_someLabel.setText(_translate("MainWindow", "Some Widget Page 2"))
        self.page1_pushButton2.setText(_translate("MainWindow", "Page 1"))
        self.page2_pushButton2.setText(_translate("MainWindow", "Page 2"))
        self.home_pushButton.setText(_translate("MainWindow", "Home"))

main.py
 import sys
from PyQt5 import QtWidgets
from main_UI import Ui_MainWindow
class Main(QtWidgets.QMainWindow):
    def __init__(self):
        super(Main, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.ui.stackedWidget.setCurrentIndex(0)
        self.ui.page1_pushButton1.clicked.connect(lambda: self.show_stacked_widget(1))
        self.ui.page1_pushButton1.clicked.connect(lambda: self.show_sub_stacked_widget(0))
        self.ui.page2_pushButton1.clicked.connect(lambda: self.show_stacked_widget(1))
        self.ui.page2_pushButton1.clicked.connect(lambda: self.show_sub_stacked_widget(1))
        self.ui.page1_pushButton2.clicked.connect(lambda: self.show_sub_stacked_widget(0))
        self.ui.page2_pushButton2.clicked.connect(lambda: self.show_sub_stacked_widget(1))
        self.ui.home_pushButton.clicked.connect(lambda: self.show_stacked_widget(0))
        self.ui.subPage1_pushButton.clicked.connect(lambda: self.show_sub_sub_stacked_widget(0))
        self.ui.subPage2_pushButton.clicked.connect(lambda: self.show_sub_sub_stacked_widget(1))
    def show_stacked_widget(self, index):
        self.ui.stackedWidget.setCurrentIndex(index)
    def show_sub_stacked_widget(self, index):
        self.ui.subStackedWidget.setCurrentIndex(index)
    def show_sub_sub_stacked_widget(self, index):
        self.ui.subSubStackedWidget.setCurrentIndex(index)
if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    application = Main()
    application.show()
    sys.exit(app.exec_())

Отредактировано Anton_VolAnt (Март 25, 2021 20:46:42)

Офлайн

#2 Март 25, 2021 21:34:57

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

PyQt5: Сохранение пропорций всех виджетов при изменении размеров главного окна с использованием Qt Designer

Anton_VolAnt
Долго игрался с Layout'ами и sizePolicy - ничего не выходит.
Anton_VolAnt
Подскажите пожалуйста оптимальное решение.
Сразу предупрежу что не спец в Qt.

Когда вы хотите пропорционального изменения контролов вы сразу используете не тот инструмент.
Qt долго и упорно разрабатывался для того чтобы контролы менялись непропорционально. А именно с сохранением размера шрифтов, адаптацией под разные пропорции монитора и т.д. и т.п.

Нужное вам поведение наблюдается в svg (html) и некоторых игровых движках. Но там вам тогда не следует рассчитывать на наличие эдитов чекбоксов и проч. поскольку при изменении масштабов такие контролы становятся практически непригодны к использованию.

Мой совет, забыть об идее пропорционального изменения вместо этого получше изучить те методы которые предлагают стандартные GUI фреймворки.




Офлайн

#3 Март 26, 2021 09:03:41

Anton_VolAnt
Зарегистрирован: 2021-02-25
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt5: Сохранение пропорций всех виджетов при изменении размеров главного окна с использованием Qt Designer

Я неверно не правильно сформулировал проблему и залез в высокие материи.

А именно с сохранением размера шрифтов, адаптацией под разные пропорции монитора и т.д. и т.п.
Это примерно как раз то, что я ищу. У меня получается, что при разных экранах или при максимизации/фуллскрине окна все виджеты остаются на своих местах “в уголке” и сохраняют свои размеры. Я же хочу, что бы они все распределялись по окну “равномерно”. Т.е. те кто снизу оставались снизу окна, те, кто справа были справа. При этом некоторые растягивались до определенного maxSize, а другие заполняли оставшееся пространство.
Мне кажется, что должно быть какое-то относительно простое решение, которое я упустил при изучении материалов и пока просто не могу найти понятной для себя формулировки. Но может я и тут ошибаюсь.


Мой совет, забыть об идее пропорционального изменения вместо этого получше изучить те методы которые предлагают стандартные GUI фреймворки.

Не могли бы, для примера, “тыкнуть пальчиком” в один или два?

Отредактировано Anton_VolAnt (Март 26, 2021 10:06:17)

Офлайн

#4 Март 26, 2021 11:57:46

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2756
Репутация: +  184  -
Профиль   Отправить e-mail  

PyQt5: Сохранение пропорций всех виджетов при изменении размеров главного окна с использованием Qt Designer

> Долго игрался с Layout'ами и sizePolicy - ничего не выходит. При использовании resizeEvent нужно для каждого виджета прописывать setGeometry, что очень долго и неудобно.

Зачем тебе переопределять resizeEvent? Тебе надо установить виджеты в компановщики и всё. Qt сам будет подстраивать их размер под размер окна.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#5 Март 26, 2021 12:21:18

Anton_VolAnt
Зарегистрирован: 2021-02-25
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt5: Сохранение пропорций всех виджетов при изменении размеров главного окна с использованием Qt Designer

Rodegast
> Тебе надо установить виджеты в компановщики и всё. Qt сам будет подстраивать их размер под размер окна.

Вот с этим то как раз и проблема. Я либо не так, либо не те компоновщики использую. Все layout'ы, сделанные в Designer'e имеют свой “условный” размер и по итогу с таким же размером остаются и не “тянутся” за MainWindow

Офлайн

#6 Март 26, 2021 12:25:46

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2756
Репутация: +  184  -
Профиль   Отправить e-mail  

PyQt5: Сохранение пропорций всех виджетов при изменении размеров главного окна с использованием Qt Designer

Где ui файл?



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#7 Март 26, 2021 12:28:24

Anton_VolAnt
Зарегистрирован: 2021-02-25
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt5: Сохранение пропорций всех виджетов при изменении размеров главного окна с использованием Qt Designer

Rodegast
Где ui файл?
В первом посте main_UI.py сгенерированный.
Или исходник нужен? Это уже вечером, как до компа доберусь

Офлайн

#8 Март 26, 2021 16:35:58

Anton_VolAnt
Зарегистрирован: 2021-02-25
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt5: Сохранение пропорций всех виджетов при изменении размеров главного окна с использованием Qt Designer

Rodegast
Где ui файл?

Даю исходный UI в первоначальном виде.

Отредактировано Anton_VolAnt (Март 26, 2021 16:42:26)

Прикреплённый файлы:
attachment main_UI.ui (11,1 KБ)

Офлайн

#9 Март 26, 2021 18:06:40

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2756
Репутация: +  184  -
Профиль   Отправить e-mail  

PyQt5: Сохранение пропорций всех виджетов при изменении размеров главного окна с использованием Qt Designer

Компановщики нужно ставить ещё на форму и страницу штакета, иначе они работать не будут.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Прикреплённый файлы:
attachment main_UI-2.ui (12,8 KБ)

Офлайн

#10 Март 26, 2021 18:37:56

Anton_VolAnt
Зарегистрирован: 2021-02-25
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt5: Сохранение пропорций всех виджетов при изменении размеров главного окна с использованием Qt Designer

Rodegast
Компановщики нужно ставить ещё на форму и страницу штакета, иначе они работать не будут.
Спасибо огромное!!!
Я компановщики ставил не “на” форму и страницы, а вкладывал внутрь.

Прикреплённый файлы:
attachment 3.png (16,4 KБ)

Офлайн

  • Начало
  • » Python для новичков
  • » PyQt5: Сохранение пропорций всех виджетов при изменении размеров главного окна с использованием Qt Designer[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version