QT:QSplitter中的Stretch因子无效。

5

我在项目中使用了 QSplitter ,想要设置两个小部件的拉伸因子(stretch factor)。下面的代码是推荐的:

    splitter.setStretchFactor(0, 1)
    splitter.setStretchFactor(1, 5)

我需要首先隐藏一个小部件,然后在点击一个按钮后显示它。 我发现stretch factor不起作用。 整个代码如下:

from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys

class MainWindow(QWidget):

    def __init__(self):
        super().__init__()

        mainLayout = QVBoxLayout()
        self.setLayout(mainLayout)
        self.btn = QPushButton('show')
        self.btn.clicked.connect(self.btnSlot)
        mainLayout.addWidget(self.btn)
        layout = QHBoxLayout()
        mainLayout.addLayout(layout)
        self.w1 = QWidget()
        self.w1.setStyleSheet('border: 2px solid #777;')
        self.w1.hide()
        self.lay1 = QVBoxLayout()
        self.lay1.addWidget(QLabel('label 1'))
        self.w1.setLayout(self.lay1)

        w2 = QWidget()
        w2.setStyleSheet('border: 2px solid red;')
        self.lay2 = QVBoxLayout()
        w2.setLayout(self.lay2)

        splitter = QSplitter()
        splitter.addWidget(self.w1)
        splitter.addWidget(w2)
        splitter.setStretchFactor(0, 1)
        splitter.setStretchFactor(1, 5)
        layout.addWidget(splitter)

    def btnSlot(self, check=False):
        self.w1.show()
        self.lay2.addWidget(QLabel('label 2'))

if __name__ == '__main__':

    app = QApplication(sys.argv)
    w = MainWindow()
    w.show()
    app.exec_()

点击“显示”按钮后,结果如下:

enter image description here

从上图可见,小部件1/2的拉伸因子不是1:5。我该如何使拉伸因子为1:5?

欢迎提出任何建议!

1个回答

5
void QSplitter::setStretchFactor(int index, int stretch)
更新位置为index的子窗口的大小策略,使其具有拉伸因子stretch。
stretch并不是实际的拉伸因子;实际的拉伸因子是通过取子窗口的初始大小并将其乘以stretch计算得出。 void QSplitter::setSizes(const QList &list)
将子窗口的尺寸分别设置为列表中给定的值。
如果拆分器是水平的,则按从左到右的顺序将每个部件的宽度设置为像素值。如果拆分器是垂直的,则按从上到下的顺序设置每个部件的高度。
列表中的额外值将被忽略。如果list包含的值过少,则结果未定义,但程序仍将表现良好。
拆分器窗口的整体大小不受影响。相反,任何额外/缺少的空间将根据各个子窗口尺寸的相对权重进行分配。
如果指定大小为0,则子窗口将不可见。保留子窗口的大小策略。也就是说,小于各自部件的最小大小提示的值将被提示值的值替换。
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *


class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        mainLayout = QVBoxLayout()
        self.setLayout(mainLayout)
        
        self.btn = QPushButton('show')
        self.btn.clicked.connect(self.btnSlot)
        mainLayout.addWidget(self.btn)
        layout = QHBoxLayout()
        mainLayout.addLayout(layout)
        
        self.w1 = QWidget()
        self.w1.setStyleSheet('border: 2px solid #777;')
        self.w1.hide()
        self.lay1 = QVBoxLayout()
        self.lay1.addWidget(QLabel('label 1'))
        self.w1.setLayout(self.lay1)

        self.w2 = QWidget()
        self.w2.setStyleSheet('border: 2px solid red;')
        self.lay2 = QVBoxLayout()
        self.w2.setLayout(self.lay2)

        splitter = QSplitter(Qt.Horizontal)
        splitter.addWidget(self.w1)
        splitter.addWidget(self.w2)
        splitter.setStretchFactor(0, 1)
        splitter.setStretchFactor(1, 5)
        
        splitter.setSizes([100,500])                                 # +++ 
        
        layout.addWidget(splitter)

    def btnSlot(self, check=False):
        self.w1.show()
        self.lay2.addWidget(QLabel('label 2'))
        
        QTimer.singleShot(0, self._print)
        
    def _print(self):
        print(f'{self.size()}')
        print(f'{self.w1.size()}')
        print(f'{self.w2.size()}')
        

if __name__ == '__main__':

    app = QApplication(sys.argv)
    w = MainWindow()
    w.resize(628, 280)                                                # +++ 
    w.show()
    app.exec_()

enter image description here


感谢您的回复。有效拉伸因子=拉伸*初始小部件大小。由于widget1是隐藏的,因此初始小部件大小是未知的,这使得setStretchFactor无法正常工作。我的理解正确吗? - Qiang Zhang

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