将 QTableView 高度调整为其内容(几行)
Adjust QTableView Height to its content (few lines)
下面是我的应用程序的屏幕截图。我想去掉最后一个用红色矩形标记的表格行之后的空格:
水平尺寸政策正在扩展,垂直尺寸政策是最小的,对于其他表格,它都设置为扩展。
我正在使用我在另一个 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);
我在 populate/update 表格中使用 Qt ModelView 模式。
更新:我做了一个小例子来用 QTableView 重现这个问题:https://github.com/embeddedmz/QTableViewAdjustPolicyNotWorkingProperly
使用最新的Qt版本(来自Qt官方安装程序),没有问题。但是,使用 vcpkg 提供的 Qt 库(肯定过时了)问题就在那里。
使用 vcpkg 提供的 Qt:
使用Qt公司提供的最新Qt:
如果你有一些完全可以在 Ubuntu 20.04 LTS 上构建的东西,post 一个 link 到完整的项目(将它剥离到这一部分),我会拿一个实际的戳它。
使用 Qt 多年,我的直觉告诉我,你被 Margins 烧毁了。
https://doc.qt.io/qt-5/qwidget.html#contentsMargins
您可能需要将下边距设置为零。
https://doc.qt.io/qt-5/qmargins.html#setBottom
如果您检索这些小部件的边距,您可能会发现它们不为零。
我在问题中描述的问题随着最新的Qt版本消失了。
我将 git 拉取我的 vcpkg 存储库,更新 Qt 并检查此问题是否随着 vcpkg 提供的最新版本的 Qt 消失:Qt5 已经升级但问题仍然存在。我将在我的程序中使用 vcpkg Qt6 库,因为提供的 Qt5 不是最新的。
你也可以用一个技巧解决你的问题,这个问题发生在你身上是因为你的数据小于 table 大小。我克隆了您的项目并 更改大小策略
下面是我的应用程序的屏幕截图。我想去掉最后一个用红色矩形标记的表格行之后的空格:
水平尺寸政策正在扩展,垂直尺寸政策是最小的,对于其他表格,它都设置为扩展。
我正在使用我在另一个 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);
我在 populate/update 表格中使用 Qt ModelView 模式。
更新:我做了一个小例子来用 QTableView 重现这个问题:https://github.com/embeddedmz/QTableViewAdjustPolicyNotWorkingProperly
使用最新的Qt版本(来自Qt官方安装程序),没有问题。但是,使用 vcpkg 提供的 Qt 库(肯定过时了)问题就在那里。
使用 vcpkg 提供的 Qt:
使用Qt公司提供的最新Qt:
如果你有一些完全可以在 Ubuntu 20.04 LTS 上构建的东西,post 一个 link 到完整的项目(将它剥离到这一部分),我会拿一个实际的戳它。
使用 Qt 多年,我的直觉告诉我,你被 Margins 烧毁了。
https://doc.qt.io/qt-5/qwidget.html#contentsMargins
您可能需要将下边距设置为零。
https://doc.qt.io/qt-5/qmargins.html#setBottom
如果您检索这些小部件的边距,您可能会发现它们不为零。
我在问题中描述的问题随着最新的Qt版本消失了。
我将 git 拉取我的 vcpkg 存储库,更新 Qt 并检查此问题是否随着 vcpkg 提供的最新版本的 Qt 消失:Qt5 已经升级但问题仍然存在。我将在我的程序中使用 vcpkg Qt6 库,因为提供的 Qt5 不是最新的。
你也可以用一个技巧解决你的问题,这个问题发生在你身上是因为你的数据小于 table 大小。我克隆了您的项目并 更改大小策略