Альтернатива QHBoxLayout для детей не одинакового размера - PullRequest
0 голосов
/ 11 июля 2019

Я бы хотел иметь панель фиксированного размера слева от моего окна, где я держу свои кнопки, метки и т. Д., И QPlainTextEdit (как журнал) справа, который должен динамически изменяться при изменение общего размера окна.

В идеале я хотел бы, чтобы левая сторона была зафиксирована, а правая - динамически изменяемым.

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

Ответы [ 2 ]

2 голосов
/ 11 июля 2019

Вы можете использовать QHBoxLayout.setStretch() для этого, например,

from PyQt5.QtWidgets import QWidget,QHBoxLayout, QLabel, QApplication
from PyQt5.QtCore import Qt

class MyWidget(QWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        layout = QHBoxLayout(self)
        label1 = QLabel('This one is fixed', self)
        label1.setAutoFillBackground(True)
        label1.setStyleSheet('background:green')

        label2 = QLabel('This one is flexible', self)
        label2.setAlignment(Qt.AlignCenter)
        label2.setAutoFillBackground(True)
        label2.setStyleSheet('background:red')

        layout.addWidget(label1)
        layout.addWidget(label2)

        # set stretch factor of first item in layout to 0 and of second item to 1
        layout.setStretch(0,0)
        layout.setStretch(1,1)

        self.resize(500,350)


if __name__=="__main__":
    app = QApplication([])
    w = MyWidget()
    w.show()
    app.exec()

Скриншот:

screenshot

1 голос
/ 11 июля 2019

Как и в другом ответе, вы можете просто использовать Stretch, НО ... вы также можете использовать его в сочетании с различными типами блоков как таковыми:

VCntnr-1 = QVBoxLayout()
   VCntnr-1.addWidget(Button1)
   VCntnr-1.addWidget(Button2)
   VCntnr-1.addStretch(1)
HCntnr-1 = QHBoxLayout()
    HCntnr-1.addLayout(VCntnr-1)
    HCntnr-1.addWidget(TextBox)
    HCntnr-1.addStretch(1)

Это может привести к тому, что ваши кнопки и так будутстатически содержится в левом верхнем углу.Конечно, в зависимости от того, как вы хотите расположить левую сторону, возможно, она может содержать 2 QVBoxLayouts с некоторыми кнопками в первой Stretch и несколькими кнопками во второй

VCntnr-1 = QVBoxLayout()
    VCntnr-1.addWidget(Button1)
    VCntnr-1.addWidget(Button2)
VCntnr-2 = QVBoxLayout()
    VCntnr-2.addWidget(Button3)
    VCntnr-2.addWidget(Button4)
VCntnr-3 = QVBoxLayout()
    HCntnr-3.addLayout(VCntnr-1)
    HCntnr-3.addStretch(1)
    HCntnr-3.addLayout(VCntnr-2)
HCntnr-1 = QHBoxLayout()
    HCntnr-1.addLayout(VCntnr-1)
    HCntnr-1.addWidget(TextBox)
    HCntnr-1.addStretch(1)

Таким образом, контейнеры вместе с Stretches - это то, чтоиспользуются для динамической и статической компоновки макета, который вы пытаетесь достичь, поэтому не зацикливайтесь на одном макете блока, используйте блоки разумно для достижения ваших целей.Существует также GridLayout, который можно использовать.

Теперь я поместил одну кнопку внутри QHBoxLayout вместе со Stretch, чтобы разместить ее слева или справа от его непосредственного контейнера, и я использовал пустые метки какПроставки (хотя я думаю, что в pyqt5 есть нечто, называемое «Spacer?»), Чтобы разместить некоторое свободное пространство между меткой и связанным с ней объектом.Так что это все о творческом использовании всех кусочков и кусочков для визуализации эстетики, которую вы пытаетесь достичь.

Обратите внимание, что вышеприведенные отступы для простоты чтения и должны быть удалены в коде.

...