PyQT5 - 混合 VBox 和 HBox 布局?
PyQT5 - mix VBox and HBox Layout?
我创建了以下 windows 通常工作正常:
from PyQt5.QtWidgets import (QApplication, QComboBox, QDialog,
QDialogButtonBox, QFormLayout, QGridLayout, QGroupBox, QHBoxLayout,
QLabel, QLineEdit, QMenu, QMenuBar, QPushButton, QSpinBox, QTextEdit,
QVBoxLayout)
import sys
class Dialog(QDialog):
NumGridRows = 3
NumButtons = 4
def __init__(self):
super(Dialog, self).__init__()
self.createFormGroupBox()
self.Button1 = QPushButton(self)
self.Button1.setText("Calc")
self.Button2 = QPushButton(self)
self.Button2.setText("Reset")
# buttonBox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
# buttonBox.accepted.connect(self.accept)
# buttonBox.rejected.connect(self.reject)
mainLayout = QVBoxLayout()
mainLayout.addWidget(self.formGroupBox)
# mainLayout.addWidget(buttonBox)
mainLayout.addWidget(self.Button1)
mainLayout.addWidget(self.Button2)
self.setLayout(mainLayout)
self.setWindowTitle("Form Layout")
def createFormGroupBox(self):
self.formGroupBox = QGroupBox("Form layout")
layout = QFormLayout()
layout.addRow(QLabel("Name:"), QLineEdit())
layout.addRow(QLabel("Country:"), QComboBox())
layout.addRow(QLabel("Age:"), QSpinBox())
self.formGroupBox.setLayout(layout)
if __name__ == '__main__':
app = QApplication(sys.argv)
dialog = Dialog()
sys.exit(dialog.exec_())
我唯一想改变的是按钮在表单布局下是水平排列的,而不是垂直排列的。
如何实现将垂直框与水平框混合在一起?
Qt layout manager is a "container" of QLayoutItems,它们是表示可视对象的抽象项,可以布局。
这些项目通常包含一个 Qt 小部件,但它们也可以是其他对象,如间隔器 (QSpacerItem) 甚至其他布局(请注意,QLayout 实际上继承自 QLayoutItem)。
您实际上可以进行嵌套布局。
解决您的问题其实很简单:
- 创建水平布局;
- 将按钮添加到该布局;
- 将布局添加到main布局;
class Dialog(QDialog):
NumGridRows = 3
NumButtons = 4
def __init__(self):
super(Dialog, self).__init__()
self.setWindowTitle("Form Layout")
self.createFormGroupBox()
# QLayout(widget) automatically sets the layout on "widget" so you
# don't need to call widget.setLayout()
mainLayout = QVBoxLayout(self)
mainLayout.addWidget(self.formGroupBox)
self.button1 = QPushButton("Calc")
self.button2 = QPushButton("Reset")
buttonLayout = QHBoxLayout()
buttonLayout.addWidget(self.button1)
buttonLayout.addWidget(self.button2)
mainLayout.addLayout(buttonLayout)
备注:
- 当要将小部件添加到布局时,没有必要提供小部件参数(
self
,在这种情况下),因为将它们添加到在小部件上设置的布局会自动重新设置父级他们;
- 只有 classes 和常量应该有大写的名称,而不是变量、函数或实例属性(这就是我更改
button1
和 button2
的原因);请记住,可读性 非常 重要,请参阅官方 Style Guide for Python Code 以了解更多信息;
- QDialogButtonBox 本身就是一个 QWidget,有其内部布局;不过,您仍然可以将它用于自定义按钮;例如,您可以更改
Ok
按钮的文本 buttonBox.button(buttonBox.Ok).setText("Calc")
;或者您可以通过 okButton = QPushButton("Calc")
和 buttonBox.addButton(okButton, buttonBox.AcceptRole)
添加自定义按钮;请仔细研究 documentation 以更好地理解 class; 的行为
我创建了以下 windows 通常工作正常:
from PyQt5.QtWidgets import (QApplication, QComboBox, QDialog,
QDialogButtonBox, QFormLayout, QGridLayout, QGroupBox, QHBoxLayout,
QLabel, QLineEdit, QMenu, QMenuBar, QPushButton, QSpinBox, QTextEdit,
QVBoxLayout)
import sys
class Dialog(QDialog):
NumGridRows = 3
NumButtons = 4
def __init__(self):
super(Dialog, self).__init__()
self.createFormGroupBox()
self.Button1 = QPushButton(self)
self.Button1.setText("Calc")
self.Button2 = QPushButton(self)
self.Button2.setText("Reset")
# buttonBox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
# buttonBox.accepted.connect(self.accept)
# buttonBox.rejected.connect(self.reject)
mainLayout = QVBoxLayout()
mainLayout.addWidget(self.formGroupBox)
# mainLayout.addWidget(buttonBox)
mainLayout.addWidget(self.Button1)
mainLayout.addWidget(self.Button2)
self.setLayout(mainLayout)
self.setWindowTitle("Form Layout")
def createFormGroupBox(self):
self.formGroupBox = QGroupBox("Form layout")
layout = QFormLayout()
layout.addRow(QLabel("Name:"), QLineEdit())
layout.addRow(QLabel("Country:"), QComboBox())
layout.addRow(QLabel("Age:"), QSpinBox())
self.formGroupBox.setLayout(layout)
if __name__ == '__main__':
app = QApplication(sys.argv)
dialog = Dialog()
sys.exit(dialog.exec_())
我唯一想改变的是按钮在表单布局下是水平排列的,而不是垂直排列的。
如何实现将垂直框与水平框混合在一起?
Qt layout manager is a "container" of QLayoutItems,它们是表示可视对象的抽象项,可以布局。
这些项目通常包含一个 Qt 小部件,但它们也可以是其他对象,如间隔器 (QSpacerItem) 甚至其他布局(请注意,QLayout 实际上继承自 QLayoutItem)。
您实际上可以进行嵌套布局。
解决您的问题其实很简单:
- 创建水平布局;
- 将按钮添加到该布局;
- 将布局添加到main布局;
class Dialog(QDialog):
NumGridRows = 3
NumButtons = 4
def __init__(self):
super(Dialog, self).__init__()
self.setWindowTitle("Form Layout")
self.createFormGroupBox()
# QLayout(widget) automatically sets the layout on "widget" so you
# don't need to call widget.setLayout()
mainLayout = QVBoxLayout(self)
mainLayout.addWidget(self.formGroupBox)
self.button1 = QPushButton("Calc")
self.button2 = QPushButton("Reset")
buttonLayout = QHBoxLayout()
buttonLayout.addWidget(self.button1)
buttonLayout.addWidget(self.button2)
mainLayout.addLayout(buttonLayout)
备注:
- 当要将小部件添加到布局时,没有必要提供小部件参数(
self
,在这种情况下),因为将它们添加到在小部件上设置的布局会自动重新设置父级他们; - 只有 classes 和常量应该有大写的名称,而不是变量、函数或实例属性(这就是我更改
button1
和button2
的原因);请记住,可读性 非常 重要,请参阅官方 Style Guide for Python Code 以了解更多信息; - QDialogButtonBox 本身就是一个 QWidget,有其内部布局;不过,您仍然可以将它用于自定义按钮;例如,您可以更改
Ok
按钮的文本buttonBox.button(buttonBox.Ok).setText("Calc")
;或者您可以通过okButton = QPushButton("Calc")
和buttonBox.addButton(okButton, buttonBox.AcceptRole)
添加自定义按钮;请仔细研究 documentation 以更好地理解 class; 的行为