PyQt 5: как сохранить относительный размер виджета при расширении окна

Я работаю над пользовательским интерфейсом в Maya 2018, который использует PyQt5 (через PySide2 - есть некоторые минимальные различия, но по сути это PyQt5).

У меня есть QHBoxLayout с двумя виджетами, и обе их политики изменения размеров настроены на «расширение». Я установил минимальную ширину одного из них примерно в два раза больше, чем другой.

Всякий раз, когда я расширяю окно, меньший виджет расширяется до тех пор, пока не станет того же размера, что и больший (который вообще не меняет размер)... и затем они оба продолжают расширяться с одинаковой скоростью - оба занимают половину окна.

Я бы предпочел, чтобы они сохраняли свои размеры относительно друг друга на протяжении всего расширения.

Есть ли способ сделать это, что я просто полностью упускаю из виду?

Вот некоторый упрощенный код, который я набросал, чтобы воспроизвести проблему:

import PySide2.QtWidgets as QtWidgets

class TestDialog(QtWidgets.QDialog):
    def __init__(self, *args, **kwargs):
        QtWidgets.QDialog.__init__(self, *args, **kwargs)

        main_layout = QtWidgets.QHBoxLayout()
        self.setLayout(main_layout)
        main_layout.setContentsMargins(5, 5, 5, 5)
        main_layout.setSpacing(5)

        w1 = QtWidgets.QPushButton('small')
        w2 = QtWidgets.QPushButton('large')
        w1.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
        w2.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
        w2.setMinimumWidth(250)

        main_layout.addWidget(w1)
        main_layout.addWidget(w2)

        self.setMinimumWidth(450)
        self.setMinimumHeight(100)
        self.resize(450, 100)


test = TestDialog()
test.show()

person silent_sight    schedule 02.11.2019    source источник
comment
не могли бы вы опубликовать свои коды?   -  person Sachith Muhandiram    schedule 03.11.2019
comment
Или вы используете PyQt5, или вы используете PySide2, поскольку это разные пакеты. С другой стороны, он предоставляет минимальный воспроизводимый пример.   -  person eyllanesc    schedule 03.11.2019
comment
Укажите в издании вопрос, который должен использовать PySide2, так как Maya использует его нативно, PyQt5 и PySide2 отличаются, так как последний в настоящее время имеет много ошибок, которые могут повлиять на возможное решение.   -  person eyllanesc    schedule 03.11.2019
comment
Вы хотите, чтобы соотношение ширины виджетов было 1 к 2?   -  person eyllanesc    schedule 03.11.2019
comment
Это не обязательно 1 к 2, просто где-то рядом (в настоящее время я экспериментирую с тем, какая будет наилучшая разница в размерах)... Нужно ли мне вычислять точное математическое соотношение?   -  person silent_sight    schedule 03.11.2019
comment
@silent_sight ммм, я не понимаю. Что именно вы хотите? Мой ответ помог вам? Пожалуйста, используйте @username   -  person eyllanesc    schedule 03.11.2019
comment
Поэкспериментировав с настройкой растяжки, я обнаружил, что значения 4 и 5 мне подходят, а установка минимальной ширины сделает растяжку все еще странной. Чтобы уточнить мой вопрос по комментарию, я спросил, нужно ли мне вычислять ширину другого виджета, а затем определять фактическое соотношение между ними... Я не думаю, что значения растяжения 4 и 5 заставляют больший виджет иметь минимум ровно 250 пикселей, но это не критично...   -  person silent_sight    schedule 05.11.2019


Ответы (1)


Если вы хотите, чтобы отношения между ширинами сохранялись, вы должны установить растяжение, добавив виджеты:

from PySide2 import QtWidgets


class TestDialog(QtWidgets.QDialog):
    def __init__(self, *args, **kwargs):
        super(TestDialog, self).__init__(*args, **kwargs)

        main_layout = QtWidgets.QHBoxLayout(self)

        main_layout.setContentsMargins(5, 5, 5, 5)
        main_layout.setSpacing(5)

        w1 = QtWidgets.QPushButton("small")
        w2 = QtWidgets.QPushButton("large")
        w1.setSizePolicy(
            QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding
        )
        w2.setSizePolicy(
            QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding
        )

        main_layout.addWidget(w1, stretch=1)
        main_layout.addWidget(w2, stretch=2)

        self.setMinimumSize(450, 100)
        self.resize(450, 100)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    test = TestDialog()
    test.show()
    sys.exit(app.exec_())
person eyllanesc    schedule 03.11.2019
comment
Спасибо! Настройка растяжения работает отлично - мне просто пришлось поиграть с этими значениями, чтобы получить соотношение, которое мне нравилось... Я также обнаружил, что если вы используете это, вы не должны устанавливать минимальную ширину и просто позволить растяжению заботиться об этом. - person silent_sight; 05.11.2019