我正在为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,但我不打算静态设置标签的大小,而是使用比率动态设置。
答案 0 :(得分:1)
这是一个应该解决问题的小例子。关键是分两部分:
使用QGridLayout
,将列宽设置为其列中最宽小部件的宽度(除非另行定义)。这可确保一切都沿垂直轴很好地对齐。
设置伸展因子。这决定了元素在调整父元素大小时应该如何调整大小。默认情况下它为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.labels
和self.text_edits
并创建一个字典,将标签映射到text_edit
的文本。
results = {}
for label, text_edit in zip(self.labels, self.text_edits):
results[label] = text_edit.text()