即使有垂直滚动条,如何适应 table 中的列

how to fit columns in table even with vertical scrollbar

我有一个包含 3 列的 table。第二列内容比其他两列小。所以当我初始化父对象(QMainWindow)时,我会像这样调整列的大小:

QSize tblSize = ui.tblUsers->size();

ui.tblUsers->setColumnWidth(0, 3 * tblSize .width() / 8);
ui.tblUsers->setColumnWidth(1, 2 * tblSize .width() / 8);
ui.tblUsers->setColumnWidth(2, 3 * tblSize .width() / 8);

一切都很好,直到行数增加并且垂直滚动条添加到 table。此滚动条将占用 space,因此给定列的宽度总和将超过 tables 宽度(旧宽度 - 滚动条宽度)。并且因此还添加了一个水平滚动条,这使得事情变得非常难看。

所以有没有办法解决这个问题?例如,无论如何都要检查是否有垂直滚动条,然后像这样调整列的大小:

QSize tblSize = ui.tblUsers->size();

ui.tblUsers->setColumnWidth(0, 3 * (tblSize .width()-scrollBarSize) / 8);
ui.tblUsers->setColumnWidth(1, 2 * (tblSize .width()-scrollBarSize) / 8);
ui.tblUsers->setColumnWidth(2, 3 * (tblSize .width()-scrollBarSize) / 8);

您可以installEventFilter()并拦截滚动条QShowEvent,然后调整其上的列的大小:

int sz = tblSize.width();
if (ui.tblUsers->verticalScrollBar()->isVisible())
    sz -= ui.tblUsers->verticalScrollBar()->width();
ui.tblUsers->setColumnWidth(0, 3 * sz/8);
ui.tblUsers->setColumnWidth(1, 2 * sz/8);
ui.tblUsers->setColumnWidth(2, 3 * sz/8);

还要考虑ui.tblUsers->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn)

更新 2

ui.tblUsers->installEventFilter(this);

bool MainWindow::eventFilter(QObject *obj, QEvent *event) {
    if(obj==ui.tblUsers) {
        if (event->type() == QEvent::Show || event->type() == QEvent::Hide) {           
            recalculateColumnSizes(); //create such function
            return true;
        }
    }
    return __super::eventFilter(obj, event);
}