33

我不知道如何问这个,所以,请随时询问更多信息。

似乎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

4

3 回答 3

43

我设法找到了解决此问题的方法,您只需要在调用resizeColumnsToContents().

例如:

tableResult->setVisible(false);
tableResult->resizeColumnsToContents();
tableResult->setVisible(true);
于 2010-08-10T01:52:09.387 回答
7

我认为这是因为 QSqlTableModel 按需加载数据,并且视图仅根据可用数据计算列宽。如果你不需要你的列是用户可调整大小的,你可以试试这个:

tableResult->horizontalHeader()->setResizeMode(QHeaderView::ResizeToContents);
于 2010-08-09T00:49:16.033 回答
4

我使用了与 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);
于 2014-08-04T17:59:51.183 回答