Как изменить размер QTableView, чтобы область больше не прокручивалась - PullRequest
9 голосов
/ 05 декабря 2009

Я хочу, чтобы размер QTableView был таким же, как таблица, в которой он содержится (и фиксирован), чтобы у него не было полосы прокрутки

Ответы [ 3 ]

7 голосов
/ 06 декабря 2009

Что вы можете сделать, так это рассчитать ширину столбцов табличного представления в соответствии с имеющимися у них данными (или вы можете просто вызвать resizeColumnToContents для каждого столбца, чтобы определить его размер в соответствии с его содержимым). Затем измените ширину табличного представления, чтобы быть равной или больше, чем общая ширина столбцов + вертикальный заголовок, если показано. Вам также необходимо отслеживать изменения модели и корректировать ширину табличного вида +, если отображается горизонтальный заголовок, вы можете отслеживать события изменения размера столбцов и заново их корректировать. Ниже приведен пример кода для этого:

инициализация:

// 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)));

настроить размер таблицы:

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();
}

изменить размер горизонтального заголовка

void MainWindow::updateSectionWidth(int logicalIndex, int, int newSize)
{
    adjustTableSize();
}

надеюсь, это поможет, с уважением

0 голосов
/ 13 октября 2016

Я пытался 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);

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

0 голосов
/ 09 сентября 2013

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);

Должно работать, если видны последний столбец и последняя строка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...