Search code examples
qtqtableviewvcpkg

Adjust QTableView Height to its content (few lines)


Below a screenshot of my application. I want to get rid of the white spaces after the last tables lines marked by red rectangles :

enter image description here

The horizontal size policy is expanding and the vertical one is minimum and for other tables it is both set to expanding.

I'm using this method I found in another SO question but as you can see the result is not flawless.

    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);
    }

Somewhere, I'm using this code to setup one of the tables :

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

I'm using Qt ModelView pattern to populate/update the tables.

Update : I made a small example to reproduce this issue with QTableView : https://github.com/embeddedmz/QTableViewAdjustPolicyNotWorkingProperly

Using the latest Qt version (from Qt official installer), there's no issue. However, using the Qt library provided by vcpkg (outdated for sure) the issue is there.

With Qt provided by vcpkg : enter image description here

With the latest Qt provided by the Qt Company (update not the latest, it's 5.12.11) : enter image description here


Solution

  • Under Qt 5.12.11, the bug does not exist. So I took a look at the QAbstractScrollArea::sizeHint code of this version and compared it with the implementation used in recent versions of Qt and found that setting verticalScrollBarPolicy to "ScrollBarAlwaysOff" the "AdjustToContents" adjustment policy works. The default value was "ScrollBarAsNeeded", in fact we can see that this value is not handled but since in Qt 5.12.11 we only compare the vertical|horizontal]scrollBarPolicy to Qt::ScrollBarAlwaysOn it prevents this bug from appearing.