如何根据内容调整QTableView的高度?

sav*_*i ᯓ 3 user-interface qt qtableview

在我的布局中,动态生成的QTableViews似乎已调整为仅显示一行。我想让表视图的容器具有滚动条,而不是单个表视图,后者应显示全部内容。

sav*_*i ᯓ 8

Qt 显然没有为此内置任何内容,您需要手动计算和设置大小。

这就是我对垂直尺寸(Qt 5.8)的处理方式。您可能想要添加 setMaximumHeight/width。

为了进一步开发它,它应该在将水平滚动条添加到大小之前检查是否存在水平滚动条。不过这对我的使用来说已经足够了。

编辑 2018-03:您可能需要调用 tableView->resizeRowsToContents(); 在此功能之前,尺寸实际上对应于内容的实际高度。

void verticalResizeTableViewToContents(QTableView *tableView)
{
    int count=tableView->verticalHeader()->count();
    int scrollBarHeight=tableView->horizontalScrollBar()->height();
    int horizontalHeaderHeight=tableView->horizontalHeader()->height();
    int rowTotalHeight=0;
    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);
        }
    }
    tableView->setMinimumHeight(horizontalHeaderHeight+rowTotalHeight+scrollBarHeight);
}
Run Code Online (Sandbox Code Playgroud)

  • 这是否需要添加`tableView-&gt;frameWidth() * 2`的值?看起来是这么回事。 (2认同)

Rat*_*tah 5

@savolai非常感谢您的代码,它对我来说效果很好。我只是做其他检查:

void verticalResizeTableViewToContents(QTableView *tableView)
{
    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->setMinimumHeight(rowTotalHeight);
}
Run Code Online (Sandbox Code Playgroud)