小部件教程 - 嵌套布局

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

我们通过创建两个布局来实现这一功能:queryLayout 是一个包含置于旁边的 QHBoxLayout,它包含 QLabelQLineEdit 小部件;mainLayout 是一个 QVBoxLayout,它包含 queryLayout 和垂直排列的 QTableView

#include <QtWidgets>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QWidget window;

    QLabel *queryLabel = new QLabel(
        QApplication::translate("nestedlayouts", "Query:"));
    QLineEdit *queryEdit = new QLineEdit();
    QTableView *resultView = new QTableView();

    QHBoxLayout *queryLayout = new QHBoxLayout();
    queryLayout->addWidget(queryLabel);
    queryLayout->addWidget(queryEdit);

    QVBoxLayout *mainLayout = new 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();
    return app.exec();
}

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

我们省略了设置 QTableView 小部件 resultView 中显示数据的模型的代码。为了完整,我们下面显示这些代码。

除了 QHBoxLayoutQVBoxLayout,Qt 还提供了 QGridLayoutQFormLayout 类来帮助构建更复杂的用户界面。这些可以在运行 Qt Designer 时看到。

设置模型

在上面的代码中,我们没有显示表格数据来源的地方,因为我们想集中讨论布局的使用。在这里,我们看到模型包含与行相对应的一系列项目,每个项目都设置用来包含两列的数据。

    QStandardItemModel model;
    model.setHorizontalHeaderLabels({ QApplication::translate("nestedlayouts", "Name"),
                                      QApplication::translate("nestedlayouts", "Office") });

    const QStringList rows[] = {
        QStringList{ QStringLiteral("Verne Nilsen"), QStringLiteral("123") },
        QStringList{ QStringLiteral("Carlos Tang"), QStringLiteral("77") },
        QStringList{ QStringLiteral("Bronwyn Hawcroft"), QStringLiteral("119") },
        QStringList{ QStringLiteral("Alessandro Hanssen"), QStringLiteral("32") },
        QStringList{ QStringLiteral("Andrew John Bakken"), QStringLiteral("54") },
        QStringList{ QStringLiteral("Vanessa Weatherley"), QStringLiteral("85") },
        QStringList{ QStringLiteral("Rebecca Dickens"), QStringLiteral("17") },
        QStringList{ QStringLiteral("David Bradley"), QStringLiteral("42") },
        QStringList{ QStringLiteral("Knut Walters"), QStringLiteral("25") },
        QStringList{ QStringLiteral("Andrea Jones"), QStringLiteral("34") }
    };

    QList<QStandardItem *> items;
    for (const QStringList &row : rows) {
        items.clear();
        for (const QString &text : row)
            items.append(new QStandardItem(text));
        model.appendRow(items);
    }

    resultView->setModel(&model);
    resultView->verticalHeader()->hide();
    resultView->horizontalHeader()->setStretchLastSection(true);

模型和视图的使用在 项视图示例模型/视图编程 概述中有说明。

示例项目 @ code.qt.io

© 2024 Qt 公司有限公司。此处包含的文档贡献权归其各自所有者所有。此处提供的文档是根据自由软件基金会发布的 GNU 自由文档许可证版本 1.3 的条款许可的。Qt 和相应商标是芬兰的 Qt 公司有限公司以及在世界其他国家的商标。所有其他商标均为其各自所有者的财产。