Как убедиться, что размер столбцов в QTableView изменен до максимального - PullRequest
28 голосов
/ 08 августа 2010

Я не знаю, как спросить об этом, поэтому не стесняйтесь спрашивать дополнительную информацию.

Похоже, что 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

Если кто-то захочет понять, о чем я говорю, просто загрузите в этом примере. Вы увидите, что нажатие на кнопку будет генерировать данные, размер которых не корректно изменяется.

Обновление 3

Возможно, ошибка: https://bugreports.qt.io/browse/QTBUG-9352

Ответы [ 3 ]

40 голосов
/ 10 августа 2010

Мне удалось найти обходной путь для этой проблемы, вам просто нужно спрятать таблицу перед вызовом resizeColumnsToContents().

Например:

tableResult->setVisible(false);
tableResult->resizeColumnsToContents();
tableResult->setVisible(true);
6 голосов
/ 09 августа 2010

Я думаю, это потому, что QSqlTableModel загружает данные по требованию, а представление вычисляет ширину столбца только на основе доступных данных. Если вам не нужно изменять размер столбцов, попробуйте следующее:

tableResult->horizontalHeader()->setResizeMode(QHeaderView::ResizeToContents);
4 голосов
/ 04 августа 2014

Я использовал тот же обходной путь, который описал 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);
...