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)。

您实际上可以进行嵌套布局

解决您的问题其实很简单:

  1. 创建水平布局;
  2. 将按钮添加到该布局;
  3. 将布局添加到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 和常量应该有大写的名称,而不是变量、函数或实例属性(这就是我更改 button1button2 的原因);请记住,可读性 非常 重要,请参阅官方 Style Guide for Python Code 以了解更多信息;
  • QDialogBu​​ttonBox 本身就是一个 QWidget,有其内部布局;不过,您仍然可以将它用于自定义按钮;例如,您可以更改 Ok 按钮的文本 buttonBox.button(buttonBox.Ok).setText("Calc");或者您可以通过 okButton = QPushButton("Calc")buttonBox.addButton(okButton, buttonBox.AcceptRole) 添加自定义按钮;请仔细研究 documentation 以更好地理解 class;
  • 的行为