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

amr*_*ree 28 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();
Run Code Online (Sandbox Code Playgroud)

更新1

我试过了tableResult->scrollToBottom(),它只会根据底部的项目调整大小.所以,如果中间有较长的单词,那些单词就会被包裹起来.

更新2

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

更新3

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

amr*_*ree 40

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

举个例子:

tableResult->setVisible(false);
tableResult->resizeColumnsToContents();
tableResult->setVisible(true);
Run Code Online (Sandbox Code Playgroud)

  • 在Qt 5.6中,`table.resizeColumnsToContents()`也可以在不隐藏/显示表的情况下工作 (2认同)

and*_*ref 6

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

tableResult->horizontalHeader()->setResizeMode(QHeaderView::ResizeToContents);
Run Code Online (Sandbox Code Playgroud)


dou*_*gg3 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);
Run Code Online (Sandbox Code Playgroud)

  • amree 的答案对我有帮助,但我同时遇到了自动调整行高的问题,并认为这对未来的读者发布我对该密切相关问题的解决方案会有帮助。我想说,比“基本上没有”多一点。 (2认同)