Aminos
Aminos

Reputation: 871

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

Upvotes: 0

Views: 1163

Answers (3)

Aminos
Aminos

Reputation: 871

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.

Upvotes: 0

Parisa.H.R
Parisa.H.R

Reputation: 3883

you can also fix your problem with one trick, this problem happens for you because your data is lower than the table size. I clone your project and change sizepolicy

enter image description here

enter image description here

Upvotes: 0

user3450148
user3450148

Reputation: 952

If you have something fully buildable on Ubuntu 20.04 LTS, post a link to the complete project (strip it down to just this part) and I will take an actual stab at it.

My gut, having worked with Qt for years, is telling me you are being burned by Margins.

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

You probably need to set a bottom margin of Zero.

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

If you retrieve the margins for those widgets you will probably find they are non-zero.

Upvotes: 1

Related Questions