简体   繁体   中英

PyQt5 resize only one child widget when window is resized

I'm building a GUI in PyQt5. Its structre will look like on the attached picture.

在此输入图像描述 What I need is to managed that when window is resized:

  • Blue area resizes both horizontally and vertically
  • Read and green areas resize only vertically
  • purple area resizes only horizontally
  • user can change size of widget sizes manually as he desires, but the should keep its width/heigh when whole window resizes

Here is code for this example:

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

Thanks for any advice, I couldn't figure it out myself.

No matter what I tried, I could not make anything work for three widgets attached to a single splitter instance (I tried SizePolicy settings, QSplitter stretch factors, ...).

So a tried to wrap it with few more QFrames and seems to work. But I'm still opened for solution for the original code.

Here's my result:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM