将 QTableView 高度调整为其内容(几行)

Adjust QTableView Height to its content (few lines)

下面是我的应用程序的屏幕截图。我想去掉最后一个用红色矩形标记的表格行之后的空格:

水平尺寸政策正在扩展,垂直尺寸政策是最小的,对于其他表格,它都设置为扩展。

我正在使用我在另一个 SO 问题中发现的方法,但如您所见,结果并非完美无缺。

    void verticalResizeTableViewToContents(QTableView* tableView)
    {
        tableView->resizeRowsToContents();

        // does it work ?
        tableView->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents);

        int rowTotalHeight = 0;

        // Rows height
        int count = tableView->verticalHeader()->count();
        for (int i = 0; i < count; ++i) {
            // 2018-03 edit: only account for row if it is visible
            if (!tableView->verticalHeader()->isSectionHidden(i)) {
                rowTotalHeight += tableView->verticalHeader()->sectionSize(i);
            }
        }

        // Check for scrollbar visibility
        if (!tableView->horizontalScrollBar()->isHidden())
        {
            rowTotalHeight += tableView->horizontalScrollBar()->height();
        }

        // Check for header visibility
        if (!tableView->horizontalHeader()->isHidden())
        {
            rowTotalHeight += tableView->horizontalHeader()->height();
        }
        tableView->setMaximumHeight(rowTotalHeight);
    }

在某处,我正在使用此代码来设置其中一个表:

m_Internals->Ui.Measures->setModel(mm->getPh66MeasuresModel());
    m_Internals->Ui.Measures->horizontalHeader()->setSectionsMovable(true);
    m_Internals->Ui.Measures->horizontalHeader()->setHighlightSections(false);
    m_Internals->Ui.Measures->horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive);
    m_Internals->Ui.Measures->horizontalHeader()->setStretchLastSection(true);

m_Internals->Ui.Measures->verticalHeader()->hide();
    m_Internals->Ui.Measures->setSelectionBehavior(QAbstractItemView::SelectRows);
    verticalResizeTableViewToContents(m_Internals->Ui.Measures);

我在 populate/update 表格中使用 Qt ModelView 模式。

更新:我做了一个小例子来用 QTableView 重现这个问题:https://github.com/embeddedmz/QTableViewAdjustPolicyNotWorkingProperly

使用最新的Qt版本(来自Qt官方安装程序),没有问题。但是,使用 vcpkg 提供的 Qt 库(肯定过时了)问题就在那里。

使用 vcpkg 提供的 Qt:

使用Qt公司提供的最新Qt:

如果你有一些完全可以在 Ubuntu 20.04 LTS 上构建的东西,post 一个 link 到完整的项目(将它剥离到这一部分),我会拿一个实际的戳它。

使用 Qt 多年,我的直觉告诉我,你被 Margins 烧毁了。

https://doc.qt.io/qt-5/qwidget.html#contentsMargins

您可能需要将下边距设置为零。

https://doc.qt.io/qt-5/qmargins.html#setBottom

如果您检索这些小部件的边距,您可能会发现它们不为零。

我在问题中描述的问题随着最新的Qt版本消失了。

我将 git 拉取我的 vcpkg 存储库,更新 Qt 并检查此问题是否随着 vcpkg 提供的最新版本的 Qt 消失:Qt5 已经升级但问题仍然存在。我将在我的程序中使用 vcpkg Qt6 库,因为提供的 Qt5 不是最新的。

你也可以用一个技巧解决你的问题,这个问题发生在你身上是因为你的数据小于 table 大小。我克隆了您的项目并 更改大小策略