Как изменить размер 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);

надеюсь, это кому-то поможет.