PyQt5窗口调整大小时只调整一个子小部件的大小

3
我正在使用PyQt5构建一个GUI。它的结构将如附图所示。
需要实现的功能是:当窗口被调整大小时:
- 蓝色区域应该同时水平和垂直地调整大小 - 红色和绿色区域只能垂直调整大小 - 紫色区域只能水平调整大小 - 用户可以手动更改小部件的大小,但在整个窗口调整大小时应保持其宽度/高度不变
以下是此示例的代码:
def initUI(self):  

    topHBoxLayout = QHBoxLayout(self)
    topHBoxLayout.setContentsMargins(0,0,0,0) 

    sstFrame  = QFrame() 
    sstFrame.setMinimumSize(QSize(100, 100))
    self.colorFrame(sstFrame, 'red')

    objectivesFrame = QFrame() 
    objectivesFrame.setMinimumSize(QSize(100, 100))
    self.colorFrame(objectivesFrame, 'green')

    wsTop = QFrame() 
    wsTop.setMinimumSize(QSize(100, 100))
    self.colorFrame(wsTop, 'blue')

    wsBottom = QFrame() 
    wsBottom.setMinimumSize(QSize(100, 100))
    self.colorFrame(wsBottom, 'purple')

    workspaceSplitter = QSplitter(Qt.Vertical) 
    workspaceSplitter.addWidget(wsTop)
    workspaceSplitter.addWidget(wsBottom)


    mainSplitter = QSplitter(Qt.Horizontal)
    mainSplitter.addWidget(sstFrame)
    mainSplitter.addWidget(objectivesFrame)
    mainSplitter.addWidget(workspaceSplitter)

    topHBoxLayout.addWidget(mainSplitter)   

    self.setLayout(topHBoxLayout)

    self.setGeometry(300, 300, 300, 200)
    self.setWindowTitle('')
    self.show()

感谢您提供的任何建议,我自己无法理解。


你有考虑过使用 DockWidgets 而不仅仅是分隔符吗? - phyatt
没有,我已经找到了解决方案,但还是谢谢你的提示。我在官方示例中找到了DockWidgets,它看起来确实很有趣。谢谢。 - dakov
1个回答

0
无论我尝试了什么,都不能使三个小部件附加到单个分裂器实例上工作(我尝试了SizePolicy设置、QSplitter拉伸因子等)。
所以我试着用更多的QFrames包装它,似乎可以工作。但我仍然开放原始代码的解决方案。
这是我的结果:
def initUI(self):  

    topHBoxLayout = QHBoxLayout(self)
    topHBoxLayout.setContentsMargins(0,0,0,0)

    sstObjWrapper = QSplitter(Qt.Horizontal) 
    sstObjWrapper.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)

    sstFrame  = QFrame() 
    sstFrame.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
    sstFrame.setMinimumSize(QSize(100, 100))
    self.colorFrame(sstFrame, 'red') 

    # --- sst frame ---

    objectivesFrame = QFrame() 
    objectivesFrame.setMinimumSize(QSize(100, 100))
    objectivesFrame.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
    self.colorFrame(objectivesFrame, 'green')

    sstObjWrapper.addWidget(sstFrame)
    sstObjWrapper.addWidget(objectivesFrame)

    tmp1  = QFrame(self)
    tmp1.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
    tmp1.setMinimumSize(QSize(200, 200))
    self.colorFrame(tmp1, 'purple') 

    tmp2  = QFrame(self) 
    tmp2.setMinimumSize(QSize(100, 100))
    tmp2.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
    self.colorFrame(tmp2, 'blue') 

    plotConsoleSplitter = QSplitter(Qt.Vertical)
    plotConsoleSplitter.addWidget(tmp1)
    plotConsoleSplitter.addWidget(tmp2)
    plotConsoleSplitter.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)


    objPlotSplitter = QSplitter(Qt.Horizontal)
    objPlotSplitter.addWidget(sstObjWrapper)
    objPlotSplitter.addWidget(plotConsoleSplitter)

    objPlotSplitter.setStretchFactor ( 0, 0 )
    objPlotSplitter.setStretchFactor ( 1, 1 )


    topHBoxLayout.addWidget(objPlotSplitter)

    self.setLayout(topHBoxLayout)
    self.setGeometry(300, 300, 300, 200)
    self.setWindowTitle('')
    self.show()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接