如何根据比例来确定QLayout的大小?

时间:2013-08-05 22:21:56

标签: python-3.x pyside

我正在为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实现其自动化时,它会得到如下内容:

Oh Noes!

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


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

1 个答案:

答案 0 :(得分:1)

这是一个应该解决问题的小例子。关键是分两部分:

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

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


  3. 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()