【问题标题】:How do I size QLayout based on proportionality?如何根据比例调整 QLayout 的大小?
【发布时间】:2014-07-09 23:18:52
【问题描述】:

我正在为我的 PySide 应用程序创建一个简单的对话框。在此对话框中,用户必须填写多个输入。与这些输入相关的是标签左侧的标签。现在我使用单独的类创建标签、输入对:

class inputLayout(PyGui.QHBoxLayout):
    def __init__(self, Label, parent):
        super(inputLayout, self).__init__()

        label = PyGui.QLabel()
        label.setText(Label)
        self.addWidget(label)

        self.__input = PyGui.QTextEdit()
        self.addWidget(self.__input)

        parent.addLayout(self)

然后像这样将它添加到主布局中:

layout = PyGui.QVBoxLayout()

self.amp = inputLayout('Amplitude', layout)
self.test = inputLayout('test', layout)
self.test2 = inputLayout('test2', layout)

问题在于,当 PySide 自动执行时,它会得到如下内容:

就像我的图片所暗示的那样,我宁愿让标签占据 1/3(或我选择的其他比例)以使其看起来更统一。如何使用这种比例或比例调整布局大小?


我是aware of this question,但我不想静态设置标签的大小,而是使用比率动态设置。

【问题讨论】:

    标签: python-3.x pyside


    【解决方案1】:

    这是一个可以解决您的问题的小示例。关键分为两部分:

    1. 使用QGridLayout,它将列宽设置为其列中最宽的小部件的宽度(除非另有定义)。这确保了一切都沿着垂直轴很好地对齐。

    2. 设置拉伸因子。这决定了元素在调整其父级大小时应如何调整大小。默认为 0,所以你不必设置它,我只是为了说明的目的添加了它。通过将 text_edit 的列设置为 1,它将开始拉伸。通过使用这些因素,您可以使一列比另一列增长得更快。


    from PySide import QtGui
    import sys
    
    class MainWindow(QtGui.QMainWindow):
      def __init__(self, parent=None):
            super(MainWindow, self).__init__(parent)
            self.input_widget = InputWidget(self)
    
            self.layout = QtGui.QVBoxLayout()
            self.layout.addWidget(self.input_widget)
            self.setLayout(self.layout)
            self.setCentralWidget(self.input_widget)
    
    class InputWidget(QtGui.QWidget):
        def __init__(self, parent):
            super(InputWidget, self).__init__(parent)
    
            self.grid_layout = QtGui.QGridLayout()
            self.labels = ["amp", "more text", "blabla"]
    
            self.text_edits = []
            self.qlabels = []
    
            for row, label in enumerate(self.labels):
                label = QtGui.QLabel(label)
                self.qlabels.append(label)
                self.grid_layout.addWidget(label, row, 0)
                text_edit = QtGui.QTextEdit()
                self.text_edits.append(text_edit)
                self.grid_layout.addWidget(text_edit, row, 1)
    
            self.grid_layout.setColumnStretch(0, 0)
            self.grid_layout.setColumnStretch(1, 2)
    
            self.setLayout(self.grid_layout)
    
    if __name__ == "__main__":
        app = QtGui.QApplication(sys.argv)
        window = MainWindow()
        window.show()
        app.exec_() 
    

    如果您想从text_edit 访问文本,您可以在self.labels 中搜索标签的索引,然后在self.text_edits 中使用该标签来检索相应的text_edit。或者,一旦您关闭对话框,您可以遍历 self.labelsself.text_edits 并创建一个字典,将标签映射到来自 text_edit 的文本。

    results = {}
    for label, text_edit in zip(self.labels, self.text_edits):
        results[label] = text_edit.text()
    

    【讨论】:

      猜你喜欢
      • 2012-01-28
      • 2015-06-20
      • 2019-10-31
      • 1970-01-01
      • 2011-12-29
      • 1970-01-01
      • 1970-01-01
      • 2012-05-06
      • 1970-01-01
      相关资源
      最近更新 更多