QSplitter设置比例

发布时间:2023-05-18

一、设置QSplitter比例的意义

QSplitter是Qt中常用的一种控件,它能够把窗口或控件分割成两个或多个部分,并且可以通过拖动来随时调整分割部分的大小。比例就是拖拽分割条时两个部分的大小比例。合理的设置QSplitter比例可以让界面更加美观和实用。

二、如何设置QSplitter的比例

QSplitter的比例可以通过splitter的setSizes函数和widget的setStretchFactor函数来设置。

# 设置QSplitter的比例
splitter.setSizes([100, 200, 300])
# 设置widget的比例
splitter.setStretchFactor(0, 1)
splitter.setStretchFactor(1, 2)
splitter.setStretchFactor(2, 3)

setSizes()函数接受一个整数列表,用于指定每个子部分的大小。setStretchFactor()函数接受两个参数,第一个参数是子部分的索引,第二个参数是该部分的比例因子。比例因子越大,该部分在调整窗口大小时获得的空间就越大。如果全部设置为1,则所有部分在水平或垂直方向上平均分配控件大小。

三、QSplitter比例的实例应用

1、水平分割窗口

以下是一个用于水平分割窗口的简单示例。我们在主窗口中创建了一个QSplitter并添加了两个widget,然后设置了它们的比例,使它们在水平方向上平分窗口大小。

class Example(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):
        hbox = QtWidgets.QHBoxLayout(self)
        topleft = QtWidgets.QFrame(self)
        topleft.setFrameShape(QtWidgets.QFrame.StyledPanel)
        topright = QtWidgets.QFrame(self)
        topright.setFrameShape(QtWidgets.QFrame.StyledPanel)
        splitter1 = QtWidgets.QSplitter(QtCore.Qt.Horizontal)
        splitter1.addWidget(topleft)
        splitter1.addWidget(topright)
        hbox.addWidget(splitter1)
        self.setLayout(hbox)
        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('QSplitter')
        self.show()
        splitter1.setSizes([self.width()/2, self.width()/2])

2、垂直分割窗口并设定大小比例

以下是一个用于垂直分割窗口的简单示例。我们将主窗口分割成三个部分,并通过设置比例来调整每个部分的大小。其中,第一个部分和第三个部分大小相同,都是整个窗口大小的25%。

class Example(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):
        centralwidget = QtWidgets.QWidget(self)
        self.setCentralWidget(centralwidget)
        splitter1 = QtWidgets.QSplitter(QtCore.Qt.Vertical)
        self.setCentralWidget(splitter1)
        topleft = QtWidgets.QFrame(self)
        topleft.setFrameShape(QtWidgets.QFrame.StyledPanel)
        bottom = QtWidgets.QFrame(self)
        bottom.setFrameShape(QtWidgets.QFrame.StyledPanel)
        splitter2 = QtWidgets.QSplitter(QtCore.Qt.Horizontal)
        splitter2.addWidget(topleft)
        splitter2.addWidget(bottom)
        right = QtWidgets.QFrame(self)
        right.setFrameShape(QtWidgets.QFrame.StyledPanel)
        splitter1.addWidget(splitter2)
        splitter1.addWidget(right)
        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('QSplitter')
        self.show()
        splitter1.setSizes([self.height()//4, self.height()//2, self.height()//4])
        splitter2.setSizes([self.width()//2, self.width()//2])

3、QSplitter实现布局

在实际应用中,QSplitter还可以用于构建界面布局,以下是一个简单的例子。我们将主窗口分割成两个部分,左侧是QTreeView,右侧是QTextEdit。并且设置拖拽分割条时树形控件占有50%的比例。

class Example(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):
        self.tree = QtWidgets.QTreeView(self)
        self.tree.setGeometry(QtCore.QRect(10, 50, 180, 200))
        self.tree.setHeaderHidden(True)
        self.content = QtWidgets.QTextEdit(self)
        splitter = QtWidgets.QSplitter(QtCore.Qt.Horizontal)
        splitter.addWidget(self.tree)
        splitter.addWidget(self.content)
        splitter.setStretchFactor(0, 1)
        self.setCentralWidget(splitter)
        self.setGeometry(300, 300, 480, 320)
        self.setWindowTitle('QSplitter')
        self.show()
if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())