如何调整QTableView的大小以使该区域不再滚动

时间:2009-12-04 23:38:34

标签: qt

我希望QTableView的大小与它包含的表(并且已修复)相同,以便它没有滚动条

3 个答案:

答案 0 :(得分:7)

您可以做的是根据他们拥有的数据计算您的tableview列宽度(或者您可以为每列调用resizeColumnToContents以将其大小调整为其内容)。然后将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();
}

处理水平标题调整大小

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

希望这有帮助,尊重

答案 1 :(得分:0)

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

如果最后一列和最后一行可见,则应该有效。

答案 2 :(得分:0)

我试过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);

我希望这有助于某人。