QT:QSplitter 中的拉伸因子不起作用

Qia*_*ang 5 python pyqt5

我在我的项目中使用 QSplitter,我想设置两个小部件的拉伸因子。推荐使用以下代码:

    splitter.setStretchFactor(0, 1)
    splitter.setStretchFactor(1, 5)
Run Code Online (Sandbox Code Playgroud)

我需要首先隐藏一个小部件,然后在单击按钮后显示它。我发现拉伸因子不起作用。整个代码是:

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_()
Run Code Online (Sandbox Code Playgroud)

单击“显示”按钮后,结果是:

在此输入图像描述

从上图中我们可以看到widget 1/2的拉伸因子不是1:5。如何使拉伸因子达到 1:5?

任何建议表示赞赏!

S. *_*ick 5

void QSplitter:: setStretchFactor (intindex,intstretch)

更新位置索引处小部件的大小策略,以具有拉伸因子。

拉伸不是有效拉伸因子;有效拉伸因子是通过获取小部件的初始大小并将其乘以拉伸来计算的。


void QSplitter:: setSizes (const QList &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_()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述