PyQt 5: как сохранить относительный размер виджета при расширении окна - PullRequest
1 голос
/ 03 ноября 2019

Я работаю над пользовательским интерфейсом в 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()

1 Ответ

2 голосов
/ 03 ноября 2019

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

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, <b>stretch=1</b>)
        main_layout.addWidget(w2, <b>stretch=2</b>)

        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_())
...