调整一个小部件的大小之前

时间:2018-11-01 08:33:51

标签: python pyside2

嗨,有没有办法在布局中先调整一个小部件的大小?例如,当我调整窗口大小时,我希望其中一个窗口小部件在调整另一个窗口小部件的大小之前先将其大小调整为零。 这是我到目前为止的内容:

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

以下是一些显示我想要的照片:

绿色先消失,然后蓝色

因此,在此示例中,我希望绿色框先变小,然后在调整主窗口大小时蓝色框要变小。如何在QT中实现这一目标?

1 个答案:

答案 0 :(得分:0)

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

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个小部件时,它才起作用。理想情况下,我可能会为此使用布局,但这对我来说已经足够好了。