我不知道怎么问这个问题,所以,请随时询问更多信息.
似乎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
amr*_*ree 40
我设法找到了解决此问题的方法,您只需要在调用之前隐藏表resizeColumnsToContents().
举个例子:
tableResult->setVisible(false);
tableResult->resizeColumnsToContents();
tableResult->setVisible(true);
Run Code Online (Sandbox Code Playgroud)
我认为这是因为QSqlTableModel按需加载数据,视图仅根据可用数据计算列宽.如果您不需要用户可调整大小的列,则可以尝试以下操作:
tableResult->horizontalHeader()->setResizeMode(QHeaderView::ResizeToContents);
Run Code Online (Sandbox Code Playgroud)
我使用了与 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)
| 归档时间: |
|
| 查看次数: |
42102 次 |
| 最近记录: |