2009-12-04 8 views

risposta

5

Quello che potrebbe fare è calcolare le larghezze delle colonne della vista tabella in base ai dati che hanno (oppure è possibile chiamare resizeColumnToContents per ogni colonna per ridimensionare il contenuto). Quindi modifica la larghezza della vista tabella per essere uguale o superiore alla larghezza totale delle colonne + intestazione verticale, se mostrato. Dovresti anche monitorare le modifiche del modello e regolare la larghezza della tua vista tabella + se viene mostrata l'intestazione orizzontale, puoi tracciare le colonne ridimensionando gli eventi e regolandoli di nuovo. Qui di seguito alcuni esempi di codice per questo:

inizializzazione:

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

regolare dimensioni 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 di modello di processo

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

processo intestazione orizzontale ridimensionare

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

speranza che questo aiuti, riguarda

+0

thx ma ero già in grado di farlo. L'unico problema qui è che è necessario prendere in considerazione la dimensione del bordo. Inoltre c'è qualcosa di sbagliato nei metodi width() e height() del curatore verticale. Il metodo di larghezza dà un valore di 0 e l'altezza mi ha dato qualcosa come 259, che era troppo grande. –

+0

l'intestazione orizzontale si spinge comunque buoni valori. –

+0

Allo stesso modo, è possibile utilizzare la funzione 'QHeaderView :: length()': 'viewRect.setWidth (customsItemsView-> horizontalHeader() -> length());' che sembra funzionare per me. –

0

sum(item.sizeHint()+headeroffset+border) non funziona bene per me, probabilmente c'è la spaziatura tra gli elementi, anche se griglia è spento. Quindi ho apportato le modifiche in questo modo:

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

Dovrebbe funzionare se l'ultima colonna e l'ultima riga sono visibili.

0

Ho provato la risposta serge_gubenko ma non ho funzionato per me (in parte perché volevo ridimensionare sia l'altezza che la larghezza) ... quindi l'ho modificato; Per evitare il tavolo di essere ridimensionata layout o widget genitore avrete bisogno di questo:

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

Poi:

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

Spero che questo aiuta qualcuno.

Problemi correlati