在窗口初始化时,如何调整QSplitter中QWidget的垂直和水平比例?

2024-09-30 20:37:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我想做一个漂亮的布局,但在QSplitter布局中初始化QWidget失败。下面是我的代码:

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

class singleGenePanel(QWidget):

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

    def initUI(self):

        lable = QLabel("Retrive information of the Gene: ")
        self.geneName = QLineEdit()
        self.geneName.setPlaceholderText("ENSG00000139618")
        runBtn = QPushButton('Search >')
        runBtn.setStyleSheet("font-size: 20px ;font-weight:bold")
        self.snpsTable = QTableWidget()
        self.keggTable = QTableWidget()
        self.keggTable.setFrameShape(QFrame.NoFrame)
        self.keggFig = QLabel(alignment=Qt.AlignCenter)

        
        inputLayout = QHBoxLayout()
        inputLayout.addWidget(lable)
        inputLayout.addWidget(self.geneName)
        inputLayout.addWidget(runBtn)

        keggSplitter = QSplitter(Qt.Horizontal)
        keggSplitter.setFrameShape(QFrame.StyledPanel)
        keggSplitter.addWidget(self.keggTable)
        keggSplitter.addWidget(self.keggFig)
        keggSplitter.setStretchFactor(0, 1)
        keggSplitter.setStretchFactor(1, 9)
        keggSplitter.setStyleSheet("QSplitter::handle{background-color: gray; width:5px; border:1px dotted gray}")

        splitter = QSplitter(Qt.Vertical)
        splitter.addWidget(self.snpsTable)
        splitter.addWidget(keggSplitter)


        
        layout = QVBoxLayout()
        layout.addLayout(inputLayout)
        layout.addWidget(splitter)
        self.setLayout(layout)
        self.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = singleGenePanel()
    demo.show()
    sys.exit(app.exec_())

为什么keggSplitter.setStretchFactor(0,1)和keggSplitter.setStretchFactor(1,9)不工作,并且左keggTable和右keggFig的长度比例不是1到9

以下是我想要的: enter image description here


Tags: fromimportselfsyspyqt5layoutsplitteraddwidget
1条回答
网友
1楼 · 发布于 2024-09-30 20:37:49

QSplitter使用复杂的计算来估计分配给每个子窗口小部件的大小。它考虑的重要方面是小部件大小提示

尝试设置

self.keggFig.setMinimumWidth(90)

一切都会如你所愿

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

class singleGenePanel(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):

        lable = QLabel("Retrive information of the Gene: ")
        self.geneName = QLineEdit()
        self.geneName.setPlaceholderText("ENSG00000139618")
        runBtn = QPushButton('Search >')
        runBtn.setStyleSheet("font-size: 20px ;font-weight:bold")
        self.snpsTable = QTableWidget()
        
        self.keggTable = QTableWidget() 
        self.keggTable.setFrameShape(QFrame.NoFrame)
        self.keggFig = QLabel(alignment=Qt.AlignCenter)  
        self.keggFig.setMinimumWidth(90)                          # +
        
        inputLayout = QHBoxLayout()
        inputLayout.addWidget(lable)
        inputLayout.addWidget(self.geneName)
        inputLayout.addWidget(runBtn)

        keggSplitter = QSplitter(Qt.Horizontal)
        keggSplitter.setFrameShape(QFrame.StyledPanel)
        keggSplitter.addWidget(self.keggTable)
        keggSplitter.addWidget(self.keggFig)
        keggSplitter.setStretchFactor(0, 1)
        keggSplitter.setStretchFactor(1, 9)
        keggSplitter.setStyleSheet(            
            "QSplitter::handle{background-color: gray; width: 5px; border: 1px dotted gray}"
        )

        splitter = QSplitter(Qt.Vertical)
        splitter.addWidget(self.snpsTable)
        splitter.addWidget(keggSplitter)
        
        layout = QVBoxLayout()
        layout.addLayout(inputLayout)
        layout.addWidget(splitter)
        self.setLayout(layout)
        self.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = singleGenePanel()
    demo.resize(620, 480)     # +
    demo.show()
    sys.exit(app.exec_())

enter image description here

相关问题 更多 >