非等长儿童的QHBoxLayout的替代

时间:2019-07-11 16:46:34

标签: pyqt5 python-3.7

我希望在窗口的左侧有一个固定的尺寸栏,在其中我将按钮,标签等保持在右边,而QPlainTextEdit(作为日志)则在右侧,当出现这种情况时应动态调整其大小。更改整个窗口的大小。

理想情况下,我希望固定左侧,动态调整其右侧大小。

我刚刚在Google上搜索了好几个小时,没有任何运气,希望我没有足够的经验找到简单的解决方案。

2 个答案:

答案 0 :(得分:2)

例如,您可以使用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 :(得分:1)

正如另一个答案所建议的那样,您可以简单地使用Stretch BUT ...也可以将其与不同类型的盒子结合使用,例如:

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,其中第一个按钮中有一些按钮,第二个按钮中有一些按钮

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)

因此,容器和Stretchs一起用于动态地和静态地布置您要实现的布局,因此不要卡在单个盒子的布局中,请明智地使用盒子来达到目的。还有一个可以使用的GridLayout。

现在,我已经在QHBoxLayout中将一个Button以及一个Stretch放置在其直接容器的左侧或右侧,并且我已经使用Blank标签作为Spacer(尽管我认为pyqt5有一个称为Spacer的东西)。在Label及其关联对象之间放置一些硬空间。因此,所有这些都是以创造性的方式使用所有点点滴滴,以呈现您要实现的美学效果。

请注意,上述缩进是为了易于阅读,需要在代码中删除。