如何将 QHBoxLayout 中的 2 个 QVBoxLayout 与每个 50% 的区域对齐以及如何对齐 combo_test11 和 txt_test22 以便它们看起来正确
How to align 2 QVBoxLayout in QHBoxLayout with 50% area each and how to align combo_test11 and txt_test22 so that they look proper in line
从图 2 中可以看出,QVBoxLayout 看起来很糟糕,那么我们如何设计才能使两者各占 QHBoxLayout 大小的 50%。
如您所见,combo_test11(QComboBox) 和 txt_test22(QLineEdit) 看起来都没有正确对齐。两个小部件应该是相同的 stacked/aligned 那么我们如何设计它。
我不能添加任何固定宽度,因为我需要整个框和小部件响应,所以任何固定宽度的解决方案都是不可接受的
下面是我的实现:
from PySide2.QtCore import Qt
from PySide2 import QtWidgets, QtCore, QtGui
from PySide2.QtGui import QStandardItemModel
from PySide2.QtWidgets import QHBoxLayout, QVBoxLayout, QAbstractItemView, QDesktopWidget, QPushButton
class WizardTkFrame(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.init_window()
def init_window(self):
self.widget = QtWidgets.QWidget()
self.scroll = QtWidgets.QScrollArea()
v1_layout = QtWidgets.QVBoxLayout(self)
v2_layout = QtWidgets.QVBoxLayout(self)
self.label_test1 = QtWidgets.QLabel()
self.label_test1.setText('Test1<font color=\"red\"> *</font>')
self.combo_test1 = QtWidgets.QComboBox(self)
v1_layout.addLayout(self.horiz_layout([self.label_test1, self.combo_test1]))
self.label_test11 = QtWidgets.QLabel()
self.label_test11.setText('Test1 value<font color=\"red\"> *</font>')
self.combo_test11 = QtWidgets.QComboBox(self)
v2_layout.addLayout(self.horiz_layout([self.label_test11, self.combo_test11]))
self.label_test2 = QtWidgets.QLabel("Test2 By")
self.combo_test2 = QtWidgets.QComboBox(self)
v1_layout.addLayout(self.horiz_layout([self.label_test2, self.combo_test2]))
self.label_test22 = QtWidgets.QLabel()
self.label_test22.setText('Test2 Value<font color=\"red\"> *</font>')
self.txt_test22 = QtWidgets.QLineEdit(self)
v2_layout.addLayout(self.horiz_layout([self.label_test22, self.txt_test22]))
layout = QtWidgets.QHBoxLayout(self)
layout.addLayout(v1_layout)
layout.addLayout(v2_layout)
self.widget.setLayout(layout)
self.scroll.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)
self.scroll.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)
self.scroll.setWidgetResizable(True)
self.scroll.setWidget(self.widget)
self.setCentralWidget(self.scroll)
def horiz_layout(self, controls: list, type="widget"):
temp_obj = QHBoxLayout()
for x in controls:
if type == "widget":
temp_obj.addWidget(x)
elif type == "layout":
temp_obj.addLayout(x)
return temp_obj
def center(widget):
qRect = widget.frameGeometry()
centerPoint = QDesktopWidget().availableGeometry().center()
qRect.moveCenter(centerPoint)
widget.move(qRect.topLeft())
if __name__ == "__main__":
app = QtWidgets.QApplication([])
widget = WizardTkFrame()
widget.setGeometry(200, 100, 600, 500)
widget.setWindowTitle("Test")
center(widget)
widget.show()
app.exec_()
无论您是在设计器中(推荐)还是在代码中执行此操作,您都可能想要使用拉伸参数。为了使这种特殊形式看起来不错,label:control 的 1:2 比率也不错。
此外,您可能希望标签文本右对齐。您可以在 HTML 标记或对齐 属性.
中执行此操作
我修改了你的 horiz_layout
函数来拉伸:
def horiz_layout(self, controls: list, type="widget"):
temp_obj = QHBoxLayout()
for x in controls:
if type == "widget":
temp_obj.addWidget(x)
elif type == "layout":
temp_obj.addLayout(x)
temp_obj.setStretch(0,1) # 0th col stretch is 1
temp_obj.setStretch(1,2) # 1th col stretch is 2
return temp_obj
我用 <div align=right>
和 </div>
封装了你所有的标签文本。这是我得到的:
从图 2 中可以看出,QVBoxLayout 看起来很糟糕,那么我们如何设计才能使两者各占 QHBoxLayout 大小的 50%。
如您所见,combo_test11(QComboBox) 和 txt_test22(QLineEdit) 看起来都没有正确对齐。两个小部件应该是相同的 stacked/aligned 那么我们如何设计它。
我不能添加任何固定宽度,因为我需要整个框和小部件响应,所以任何固定宽度的解决方案都是不可接受的
下面是我的实现:
from PySide2.QtCore import Qt
from PySide2 import QtWidgets, QtCore, QtGui
from PySide2.QtGui import QStandardItemModel
from PySide2.QtWidgets import QHBoxLayout, QVBoxLayout, QAbstractItemView, QDesktopWidget, QPushButton
class WizardTkFrame(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.init_window()
def init_window(self):
self.widget = QtWidgets.QWidget()
self.scroll = QtWidgets.QScrollArea()
v1_layout = QtWidgets.QVBoxLayout(self)
v2_layout = QtWidgets.QVBoxLayout(self)
self.label_test1 = QtWidgets.QLabel()
self.label_test1.setText('Test1<font color=\"red\"> *</font>')
self.combo_test1 = QtWidgets.QComboBox(self)
v1_layout.addLayout(self.horiz_layout([self.label_test1, self.combo_test1]))
self.label_test11 = QtWidgets.QLabel()
self.label_test11.setText('Test1 value<font color=\"red\"> *</font>')
self.combo_test11 = QtWidgets.QComboBox(self)
v2_layout.addLayout(self.horiz_layout([self.label_test11, self.combo_test11]))
self.label_test2 = QtWidgets.QLabel("Test2 By")
self.combo_test2 = QtWidgets.QComboBox(self)
v1_layout.addLayout(self.horiz_layout([self.label_test2, self.combo_test2]))
self.label_test22 = QtWidgets.QLabel()
self.label_test22.setText('Test2 Value<font color=\"red\"> *</font>')
self.txt_test22 = QtWidgets.QLineEdit(self)
v2_layout.addLayout(self.horiz_layout([self.label_test22, self.txt_test22]))
layout = QtWidgets.QHBoxLayout(self)
layout.addLayout(v1_layout)
layout.addLayout(v2_layout)
self.widget.setLayout(layout)
self.scroll.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)
self.scroll.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)
self.scroll.setWidgetResizable(True)
self.scroll.setWidget(self.widget)
self.setCentralWidget(self.scroll)
def horiz_layout(self, controls: list, type="widget"):
temp_obj = QHBoxLayout()
for x in controls:
if type == "widget":
temp_obj.addWidget(x)
elif type == "layout":
temp_obj.addLayout(x)
return temp_obj
def center(widget):
qRect = widget.frameGeometry()
centerPoint = QDesktopWidget().availableGeometry().center()
qRect.moveCenter(centerPoint)
widget.move(qRect.topLeft())
if __name__ == "__main__":
app = QtWidgets.QApplication([])
widget = WizardTkFrame()
widget.setGeometry(200, 100, 600, 500)
widget.setWindowTitle("Test")
center(widget)
widget.show()
app.exec_()
无论您是在设计器中(推荐)还是在代码中执行此操作,您都可能想要使用拉伸参数。为了使这种特殊形式看起来不错,label:control 的 1:2 比率也不错。
此外,您可能希望标签文本右对齐。您可以在 HTML 标记或对齐 属性.
中执行此操作我修改了你的 horiz_layout
函数来拉伸:
def horiz_layout(self, controls: list, type="widget"):
temp_obj = QHBoxLayout()
for x in controls:
if type == "widget":
temp_obj.addWidget(x)
elif type == "layout":
temp_obj.addLayout(x)
temp_obj.setStretch(0,1) # 0th col stretch is 1
temp_obj.setStretch(1,2) # 1th col stretch is 2
return temp_obj
我用 <div align=right>
和 </div>
封装了你所有的标签文本。这是我得到的: