Ответ 1
Мне удалось найти обходной путь для этой проблемы, вам просто нужно скрыть таблицу перед вызовом resizeColumnsToContents()
.
Пример:
tableResult->setVisible(false);
tableResult->resizeColumnsToContents();
tableResult->setVisible(true);
Я не уверен, как спросить об этом, поэтому не стесняйтесь запрашивать дополнительную информацию.
Кажется, что 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
Мне удалось найти обходной путь для этой проблемы, вам просто нужно скрыть таблицу перед вызовом resizeColumnsToContents()
.
Пример:
tableResult->setVisible(false);
tableResult->resizeColumnsToContents();
tableResult->setVisible(true);
Я думаю, это потому, что QSqlTableModel загружает данные по запросу, а представление вычисляет ширину столбцов только на доступных данных. Если вам не нужны ваши столбцы для изменения размера пользователя, вы можете попробовать следующее:
tableResult->horizontalHeader()->setResizeMode(QHeaderView::ResizeToContents);
Я использовал один и тот же обходной путь, описанный 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);