Подтвердить что ты не робот

Как убедиться, что столбцы в 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

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

Обновление 3

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

4b9b3361

Ответ 1

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

Пример:

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

Ответ 2

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

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

Ответ 3

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