即使有垂直滚动条,如何适应 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);
}
我有一个包含 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);
}