如何确保QTableView中的列被调整为最大大小

34

我不确定如何提问这个问题,所以请随时要求更多信息。

看起来tableView->resizeColumnsToContents()只会根据当前视图中的数据调整所有列的大小。这意味着如果我有更多的数据(在单词计数方面更长),那些字词将会被折叠到下一行(如果wordWrap属性设置为true)。

奇怪的是,如果我滚动到底部并刷新数据,tableView将正确地调整那些列的大小。似乎tableView不知道下面有更长的文本。

因此,我的问题是,我如何确保这些列根据所有数据的最大值调整大小?

我的代码:

QSqlTableModel *model = new QSqlTableModel;
model->setTable("item");
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
model->select();    
tableResult->setModel(model);    
tableResult->setEditTriggers(QAbstractItemView::NoEditTriggers);    
tableResult->setSelectionBehavior(QAbstractItemView::SelectRows);
tableResult->setSelectionMode(QAbstractItemView::SingleSelection);    
tableResult->resizeColumnsToContents();
tableResult->resizeRowsToContents();

更新 1

我已经尝试了tableResult->scrollToBottom(),但它只会根据底部项的大小进行调整。因此,如果中间有更长的单词,这些单词将被换行。

更新 2

如果有人想了解我在说什么,只需下载这个示例。您将看到单击PushButton将生成未正确调整大小的数据。

更新 3

可能是一个错误:https://bugreports.qt.io/browse/QTBUG-9352


我也遇到了这个问题。只有可见的行才会调整大小。你找到解决方法了吗? - CompEng88
自Qt 5.2以来,您可以在QHeaderView上调用setResizeContentsPrecision(n)函数,其中n是调整大小时它考虑的行数(或-1表示所有行)。https://doc.qt.io/qt-5/qheaderview.html#setResizeContentsPrecision - Jonathan Owens
3个回答

45

我找到了一个解决此问题的方法,你只需要在调用 resizeColumnsToContents() 之前隐藏表格即可。

例如:

tableResult->setVisible(false);
tableResult->resizeColumnsToContents();
tableResult->setVisible(true);

1
奇怪的是,在PyQt5中,table.resizeColumnsToContents()可以在不隐藏/显示表格的情况下工作。 - zdimension
2
在Qt 5.6中,table.resizeColumnsToContents()也可以在不隐藏/显示表格的情况下工作。 - Indraraj
1
在qt5.6中,仍需要使用tableResult->setVisible(false);来隐藏/显示表格以使其正常工作,在我的情况下,我们在不同的情况下隐藏或显示列,如果不进行隐藏/显示,则无法调整大小。 - vivi

6

我认为这是因为QSqlTableModel按需加载数据,视图仅基于可用数据计算列宽。如果您不需要用户可调整大小的列,则可以尝试以下方法:

tableResult->horizontalHeader()->setResizeMode(QHeaderView::ResizeToContents);

它不起作用。列仍然没有正确地调整大小。我把代码放在函数的末尾。我还尝试过使用QList<QStringList>作为数据源,使用QStandardItemModel作为模型。 - Amree

5
我采用了与amree描述相同的解决方法,对于列宽非常有效,但是tableView->resizeRowsToContents()如果任何屏幕外的列具有应该导致行高增加的多行单元格,则无法正常工作。我查看了Qt源代码,发现一些计算依赖于视口几何形状。这似乎使得列和行的所有计算都正确运行:
#include <limits>

tableView->setVisible(false);
QRect vporig = tableView->viewport()->geometry();
QRect vpnew = vporig;
vpnew.setWidth(std::numeric_limits<int>::max());
tableView->viewport()->setGeometry(vpnew);
tableView->resizeColumnsToContents();
tableView->resizeRowsToContents();
tableView->viewport()->setGeometry(vporig);
tableView.setVisible(true);

2
Amree的回答对我很有帮助,但同时我遇到了自动调整行高的问题,我认为将我的解决方案发布给未来的读者会很有帮助。我想说这不仅仅是“基本上什么都没有”。 - dougg3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接