Как изменить размер QTableView, чтобы область больше не прокручивалась
Я хочу, чтобы размер QTableView был таким же, как и таблица, которую он содержит (и фиксированный), чтобы у него не было полосы прокрутки
3 ответов
что вы можете сделать, это рассчитать ширину столбцов tableview в соответствии с данными, которые у них есть (или вы можете просто вызвать resizeColumnToContents для каждого столбца, чтобы размер его к его содержанию). Затем измените ширину tableview, чтобы быть равной или больше, чем общая ширина столбцов + вертикальный заголовок, Если показано. Вам также нужно будет отслеживать изменения модели и настраивать ширину tableview + если отображается горизонтальный заголовок, вы можете отслеживать события изменения размера столбцов и настраивать их снова. Ниже приведен пример кода для это:
инициализации:
// add 3 columns to the tableview control
tableModel->insertColumn(0, QModelIndex());
tableModel->insertColumn(1, QModelIndex());
tableModel->insertColumn(2, QModelIndex());
...
// switch off horizonatal scrollbar; though this is not really needed here
ui->tableView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
// adjust size; see code below
adjustTableSize();
// connect to the horizontal header resize event (non needed if header is not shown)
connect(ui->tableView->horizontalHeader(),SIGNAL(sectionResized(int,int,int)), this,
SLOT(updateSectionWidth(int,int,int)));
// connect to the model's datachange event
connect(ui->tableView->model(), SIGNAL(dataChanged(QModelIndex,QModelIndex)),
this, SLOT(dataChanged(QModelIndex,QModelIndex)));
отрегулируйте размер tableview:
void MainWindow::adjustTableSize()
{
ui->tableView->resizeColumnToContents(0);
ui->tableView->resizeColumnToContents(1);
ui->tableView->resizeColumnToContents(2);
QRect rect = ui->tableView->geometry();
rect.setWidth(2 + ui->tableView->verticalHeader()->width() +
ui->tableView->columnWidth(0) + ui->tableView->columnWidth(1) + ui->tableView->columnWidth(2));
ui->tableView->setGeometry(rect);
}
изменение модели процесса
void MainWindow::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight)
{
adjustTableSize();
}
обработать горизонтальный заголовок resize
void MainWindow::updateSectionWidth(int logicalIndex, int, int newSize)
{
adjustTableSize();
}
надеюсь, это поможет, с уважением
sum(item.sizeHint()+headeroffset+border)
не работает хорошо для меня, вероятно, есть интервал между элементами, даже если сетка выключена. Поэтому я сделал корректировку таким образом:
view->resizeRowsToContents();
view->resizeColumnsToContents();
QAbstractItemModel* model = view->model();
QHeaderView* horHeader = view->horizontalHeader();
QHeaderView* verHeader = view->verticalHeader();
int rows = model->rowCount();
int cols = model->columnCount();
int x = horHeader->sectionViewportPosition(cols-1) + horHeader->offset()
+ horHeader->sectionSize(cols-1) + 1;
int y = verHeader->sectionViewportPosition(rows-1) + verHeader->offset()
+ verHeader->sectionSize(rows-1) + 1;
QPoint p = view->viewport()->mapToParent(QPoint(x,y));
QRect g = view->geometry();
g.setSize(QSize(p.x(),p.y()));
view->setGeometry(g);
должно работать, если последний столбец и последняя строка видны.
пробовал serge_gubenko ответ, но я не работал для меня (отчасти потому, что я хотела размер как высота и ширина)... поэтому я изменил его; чтобы избежать изменения размера таблицы макетами или родительскими виджетами, вам понадобится следующее:
ui->tableView->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Fixed);
затем:
ui->tableView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
ui->tableView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
QRect rect = ui->tableView->geometry();
int width = 2,length = 2;
for(int col = 0;col<proxySortModel->columnCount();++col){
if(!ui->tableView->isColumnHidden(col))
width += ui->tableView->columnWidth(col);
}
for(int row =0;row<proxySortModel->rowCount();++row)
length += ui->tableView->rowHeight(row);
rect.setWidth(width);
rect.setHeight(length);
ui->tableView->setGeometry(rect);
надеюсь, это кому-то поможет.