2009-12-04 9 views

Respuesta

5

Lo que podría hacer es calcular sus columnas Tableview anchos de acuerdo con los datos que tienen (o simplemente puede llamar resizeColumnToContents para cada columna para que el tamaño de su contenido). A continuación, cambie el ancho de la tabla vista para que sea igual o mayor que el ancho total de las columnas + encabezado vertical si se muestra. También necesitaría hacer un seguimiento de los cambios del modelo y ajustar el ancho de su tabla + si se muestra un encabezado horizontal, puede rastrear columnas, cambiar el tamaño de los eventos y ajustarlos de nuevo. A continuación se muestra un código de ejemplo para esto:

inicialización:

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

ajustar el tamaño 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); 
} 

cambio de modelo de proceso

void MainWindow::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight) 
{ 
    adjustTableSize(); 
} 

proceso de cabecera horizontal cambiar el tamaño

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

esperanza que esta ayuda, que se refiere a

+0

thx pero ya pude hacerlo. El único problema aquí es que debes tener en cuenta el tamaño del borde. También hay algo mal con los métodos width() y height() del healder vertical. El método de ancho da un valor de 0 y la altura me dio algo así como 259, que era demasiado grande. –

+0

el encabezado horizontal tiene buenos valores. –

+0

En la misma línea, se puede utilizar el 'QHeaderView :: longitud()' función: 'viewRect.setWidth (customsItemsView-> horizontalHeader() -> longitud());' que parecía funcionar para mí. –

0

sum(item.sizeHint()+headeroffset+border) no funciona bien para mí, es probable que haya espacio entre los elementos, incluso si la rejilla está apagado. Así que hice el ajuste de esta manera:

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

Debería funcionar si la última columna y la última fila están visibles.

0

me trataron serge_gubenko respuesta, pero no funcionó para mí (En parte porque quería rezise altura y anchura) ... así que alteré; Para evitar la tabla que se cambia el tamaño de los diseños o widgets padres que va a necesitar esto:

ui->tableView->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Fixed); 

continuación:

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

espero que esto ayude a alguien.

Cuestiones relacionadas