如何将两个标签字段对作为一行添加到 QFormLayout?
How to add two label-field pair as one row to QFormLayout?
所以我有 QFormLayout 可以很好地管理我的 QLabel-QLineEdit 对。
问题是,我需要实现这样的目标:
水平 border/tittle 不是问题,但 "Street"-"Apartment"/"Post code"-"City" 对是问题。
所以我的问题是:如何将两对 QLabel-QLineEdit 作为一行添加到 QFromLayout?
如果 QFormLayout 无法做到这一点,您对使用其他布局(我猜是 QGridLayout)实现相同目标有什么建议吗?
请记住,标签在翻译成其他语言后可以有不同的大小比例。
提前致谢!
我认为您应该创建一个 QWidget,并使用 QLabel 和 QLineEdit 获得垂直布局,然后在 QFormLayout 中添加标签。我没有时间向您展示示例,但考虑在 QVBoxLayout 中使用 QLabel-QLineEdit 创建一个 ui。
通过创建 ui,您可以轻松地以相同的形式添加任何小部件。
所以你主窗口。您的主布局 -> 创建您的小部件 -> 添加垂直布局 -> 将您的 QLabel 和 QLineEdit 添加到您的小部件布局 -> 将您的小部件添加到您的主布局。
我认为您应该展示 QtCreator-QtDesigner 教程。这将花费您一些时间,但之后您会变得非常快。
感谢大家的回复!
我最终将 QLabel 添加为标签,将 QHBoxLayout 与 QLineEdit、QLabel 和 QLineEdit 作为字段添加到 QFormLayout。
类似于:
QLabel firstLabel, secondLabel;
QLineEdit fisrtEdit, secondEdit;
QHBoxLayout hBoxLayout;
hBoxLayout.addWidget(firstEdit);
hBoxLayout.addWidget(secondLabel);
hBoxLayout.addWidget(secondEdit);
QWidget container;
container.setLayout(hBoxLayout);
myFormLayout.addRow(firstLabel, container);
做这个把戏!
此外,如果您打算像这样添加不止一行,我需要将所有 secondLabel
设置为一个固定宽度。我通过遍历所有 secondLabel
s 两次来做到这一点:第一次找到最大宽度,第二次将此宽度设置为所有这些。
有点hacky,但到目前为止我找不到更好的方法。在我看来,使用 QGridLayout 的解决方案会更加复杂。
如果你想添加一个没有QLineEdit出现的标签,你可以定义一个QlineEdit并隐藏它:
(代码在python,只是为了说明原理)
self._dummy = QLineEdit(self)
self._dummy.hide()
layout = QFormLayout(self)
layout.addRow("text without an edit field", self._dummy)
这是我刚刚为我的解决方案创建的方法,这是一个可能对某人有帮助的伪代码版本。
def create_gb_f(self):
gb = QGroupBox("F")
ly_horiz = QHBoxLayout()
layout = QFormLayout()
layout.addRow( label, edit)
ly_horiz.addLayout(layout)
layout = QFormLayout()
layout.addRow( label, edit)
ly_horiz.addLayout(layout)
ly_horiz.addWidget( button)
gb.setLayout(ly_horiz)
return gb
所以我有 QFormLayout 可以很好地管理我的 QLabel-QLineEdit 对。
问题是,我需要实现这样的目标:
水平 border/tittle 不是问题,但 "Street"-"Apartment"/"Post code"-"City" 对是问题。
所以我的问题是:如何将两对 QLabel-QLineEdit 作为一行添加到 QFromLayout?
如果 QFormLayout 无法做到这一点,您对使用其他布局(我猜是 QGridLayout)实现相同目标有什么建议吗?
请记住,标签在翻译成其他语言后可以有不同的大小比例。
提前致谢!
我认为您应该创建一个 QWidget,并使用 QLabel 和 QLineEdit 获得垂直布局,然后在 QFormLayout 中添加标签。我没有时间向您展示示例,但考虑在 QVBoxLayout 中使用 QLabel-QLineEdit 创建一个 ui。 通过创建 ui,您可以轻松地以相同的形式添加任何小部件。
所以你主窗口。您的主布局 -> 创建您的小部件 -> 添加垂直布局 -> 将您的 QLabel 和 QLineEdit 添加到您的小部件布局 -> 将您的小部件添加到您的主布局。
我认为您应该展示 QtCreator-QtDesigner 教程。这将花费您一些时间,但之后您会变得非常快。
感谢大家的回复!
我最终将 QLabel 添加为标签,将 QHBoxLayout 与 QLineEdit、QLabel 和 QLineEdit 作为字段添加到 QFormLayout。 类似于:
QLabel firstLabel, secondLabel;
QLineEdit fisrtEdit, secondEdit;
QHBoxLayout hBoxLayout;
hBoxLayout.addWidget(firstEdit);
hBoxLayout.addWidget(secondLabel);
hBoxLayout.addWidget(secondEdit);
QWidget container;
container.setLayout(hBoxLayout);
myFormLayout.addRow(firstLabel, container);
做这个把戏!
此外,如果您打算像这样添加不止一行,我需要将所有 secondLabel
设置为一个固定宽度。我通过遍历所有 secondLabel
s 两次来做到这一点:第一次找到最大宽度,第二次将此宽度设置为所有这些。
有点hacky,但到目前为止我找不到更好的方法。在我看来,使用 QGridLayout 的解决方案会更加复杂。
如果你想添加一个没有QLineEdit出现的标签,你可以定义一个QlineEdit并隐藏它: (代码在python,只是为了说明原理)
self._dummy = QLineEdit(self)
self._dummy.hide()
layout = QFormLayout(self)
layout.addRow("text without an edit field", self._dummy)
这是我刚刚为我的解决方案创建的方法,这是一个可能对某人有帮助的伪代码版本。
def create_gb_f(self):
gb = QGroupBox("F")
ly_horiz = QHBoxLayout()
layout = QFormLayout()
layout.addRow( label, edit)
ly_horiz.addLayout(layout)
layout = QFormLayout()
layout.addRow( label, edit)
ly_horiz.addLayout(layout)
ly_horiz.addWidget( button)
gb.setLayout(ly_horiz)
return gb