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

yan*_*nce 9 qt

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

ser*_*nko 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)));
Run Code Online (Sandbox Code Playgroud)

调整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);
}
Run Code Online (Sandbox Code Playgroud)

流程模型的变化

void MainWindow::dataChanged(const QModelIndex &topLeft, const QModelIndex   &bottomRight)
{
    adjustTableSize();
}
Run Code Online (Sandbox Code Playgroud)

处理水平标题调整大小

void MainWindow::updateSectionWidth(int logicalIndex, int, int newSize)
{
    adjustTableSize();
}
Run Code Online (Sandbox Code Playgroud)

希望这有帮助,问候