警告

本节包含从 C++ 自动翻译到 Python 的代码段,可能包含错误。

小部件教程 - 嵌套布局#

正如小部件可以包含其他小部件一样,布局可以用于为小部件提供不同层次的分组。在这里,我们想在窗口顶部显示一个标签和一个线编辑框,在显示查询结果的表格视图之上。

我们通过创建两个布局来实现这一点:queryLayout 是一个包含 QHBoxLayout 的布局,该布局包含放置在侧边的新标签和 QLineEdit 小部件;mainLayout 是一个包含 queryLayout 和按垂直排列的 QTableViewQVBoxLayout

from PySide6 import QtWidgets
if __name__ == "__main__":

    app = QApplication([])
    window = QWidget()
    queryLabel = QLabel(()
        QApplication.translate("nestedlayouts", "Query:"))
    queryEdit = QLineEdit()
    resultView = QTableView()
    queryLayout = QHBoxLayout()
    queryLayout.addWidget(queryLabel)
    queryLayout.addWidget(queryEdit)
    mainLayout = QVBoxLayout()
    mainLayout.addLayout(queryLayout)
    mainLayout.addWidget(resultView)
    window.setLayout(mainLayout)
    # Set up the model and configure the view...
window.setWindowTitle(
    QApplication.translate("nestedlayouts", "Nested layouts"))
window.show()
sys.exit(app.exec())

widgets-tutorial-nestedlayouts1

请注意,我们调用 mainLayoutaddLayout() 函数来在 resultView 表格之上插入 queryLayout

我们省略了设置包含 QTableView 小部件显示数据的模型代码,resultView。为了完整性,我们以下展示这部分代码。

除了 QHBoxLayoutQVBoxLayout ,Qt 还提供了 QGridLayoutQFormLayout 类,用于处理更复杂用户界面。如果在 Qt Designer 中运行,你将能看见这些类。

设置模型#

在上面的代码中,我们没有展示表格数据的来源,因为我们想专注于布局的使用。在这里,我们可以看到模型包含了与行相对应的一系列项目,每个项目都被设置为包含两列的数据。

    model = QStandardItemModel()
    model.setHorizontalHeaderLabels({ QApplication.translate("nestedlayouts", "Name"),
                                      QApplication.translate("nestedlayouts", "Office") })
    rows = {
        QStringList{ "Verne Nilsen", "123" },
        QStringList{ "Carlos Tang", "77" },
        QStringList{ "Bronwyn Hawcroft", "119" },
        QStringList{ "Alessandro Hanssen", "32" },
        QStringList{ "Andrew John Bakken", "54" },
        QStringList{ "Vanessa Weatherley", "85" },
        QStringList{ "Rebecca Dickens", "17" },
        QStringList{ "David Bradley", "42" },
        QStringList{ "Knut Walters", "25" },
        QStringList{ "Andrea Jones", "34" }

*> = QList<QStandardItem()
    for row in rows:
        items.clear()
        for text in row:
            items.append(QStandardItem(text))
        model.appendRow(items)

    resultView.setModel(model)
    resultView.verticalHeader().hide()
    resultView.horizontalHeader().setStretchLastSection(True)

关于模型和视图的使用,请参阅项目视图示例模型/视图编程概述。

示例项目 @ code.qt.io