先调整一个小部件的大小

Resizing one widget before another

您好,有没有办法在布局中先调整一个小部件的大小?例如,当我调整 window 大小时,我希望其中一个小部件先调整为零,然后再调整另一个小部件。 这是我目前所拥有的:

from PySide2 import QtCore, QtWidgets, QtGui

class TestWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super(TestWindow, self).__init__()
        wgt = QtWidgets.QWidget(self)
        mainLayout = QtWidgets.QHBoxLayout()
        wgt.setLayout(mainLayout)
        self.setWindowTitle("Test")

        l = QtWidgets.QFrame()
        r = QtWidgets.QFrame()

        l.setStyleSheet("background-color: blue;")
        r.setStyleSheet("background-color: green;")

        mainLayout.addWidget(l)
        mainLayout.addWidget(r)            

        self.setCentralWidget(wgt)


app = QtWidgets.QApplication()        
x = TestWindow()

x.show()
app.exec_()

以下是我想要的一些图片:

绿色先消失,然后蓝色

所以在这个例子中,当我调整主要 window 大小时,我希望绿色框先变小,然后蓝色框变小。我如何在 QT 中实现这一点?

我找到了解决方法。我决定为此解决方案使用分离器。

class TitleSplitter(QtWidgets.QSplitter):

    def __init__(self):
        super(TitleSplitter, self).__init__()
        self.setStyleSheet("::handle {background-color: transparent}")
        self.setHandleWidth(0)

    def resizeEvent(self, event):
        """ Restrain the size """
        if self.count() > 1:
            w = self.widget(0).sizeHint().width()
            self.setSizes([w, self.width()-w])
        return super(TitleSplitter, self).resizeEvent(event)

    def addWidget(self, *args, **kwargs):
        """ Hide splitters when widgets added """
        super(TitleSplitter, self).addWidget(*args, **kwargs)
        self.hideHandles()

    def hideHandles(self):
        """ Hide our splitters """
        for i in range(self.count()):
            handle = self.handle(i)
            handle.setEnabled(False)
            handle.setCursor(QtCore.Qt.ArrowCursor)
            handle.setAttribute(QtCore.Qt.WA_TransparentForMouseEvents)

用法:

split = TitleSplitter()
l = QtWidgets.QFrame()
r = QtWidgets.QFrame()

l.setStyleSheet("background-color: blue;")
r.setStyleSheet("background-color: green;")
split.addWidget(l)
split.addWidget(r)

仅当您添加了 2 个小部件时才有效。理想情况下,我可能会为此使用布局,但这对我来说已经足够好了。