2009-12-04 131 views

回答

5

什么你可以做的是根据他们拥有的数据计算你的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(); 
} 

处理水平头调整

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

希望这会有所帮助,至于

+0

thx但我已经能够做到这一点。这里唯一的问题是你需要考虑边界的大小。此外,纵向healder的width()和height()方法也有问题。宽度方法的值为0,高度给了我259的东西,这太大了。 – 2009-12-07 17:04:26

+0

虽然水平标题的值很高。 – 2009-12-07 17:04:58

+0

沿着同样,你可以使用'QHeaderView ::长度()'函数:'viewRect.setWidth(customsItemsView-> horizo​​ntalHeader() - >长度());'这似乎为我工作。 – 2013-09-14 21:51:18

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

如果最后一列和最后一行可见,应该工作。

0

我试图serge_gubenko的答案,但我并没有为我工作(部分原因是因为我想rezise高度和宽度)...所以我改变它;为了避免该表由布局或父控件,你需要这样调整:

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

我希望这可以帮助别人。