首页 > 解决方案 > 将 QTableView 高度调整为其内容(几行)

问题描述

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

在此处输入图像描述

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

我正在使用我在另一个 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);

我正在使用 Qt ModelView 模式来填充/更新表格。

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

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

使用 vcpkg 提供的 Qt: 在此处输入图像描述

使用 Qt 公司提供的最新 Qt: 在此处输入图像描述

标签: qtqtableviewvcpkg

解决方案


如果您在 Ubuntu 20.04 LTS 上有完全可构建的东西,请发布完整项目的链接(将其剥离到这一部分),我将对其进行实际测试。

我与 Qt 合作多年的直觉告诉我,你正在被 Margins 烧毁。

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

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

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

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


推荐阅读