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

时间:2010-08-08 08:46:12

标签: qt qtableview

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

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

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

更新3

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

3 个答案:

答案 0 :(得分:40)

我设法找到了解决此问题的方法,您只需要在调用resizeColumnsToContents()之前隐藏该表。

举个例子:

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

答案 1 :(得分:6)

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

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

答案 2 :(得分:4)

我使用了amree描述的相同解决方法,这对于列宽很有效,但是如果任何屏幕外的列都有多行单元格应该导致行的高度增加,则tableView->resizeRowsToContents()无法正常工作。 / p>

我查看了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);