我不知道如何问这个,所以,请随时询问更多信息。
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
答案 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);