2009-12-04 2 views

Répondre

5

Qu'est-ce que vous pourrait faire est de calculer vos largeurs de colonnes tableview en fonction des données qu'ils ont (ou vous pouvez simplement appeler resizeColumnToContents pour chaque colonne pour le dimensionner à son contenu). Ensuite, modifiez la largeur de la tableview pour qu'elle soit égale ou supérieure à la largeur totale des colonnes + l'en-tête vertical s'il est affiché. Vous devez également suivre les modifications du modèle et ajuster la largeur de votre vue de table + si l'en-tête horizontal est affiché, vous pouvez suivre les colonnes et redimensionner les événements et les ajuster à nouveau. Ci-dessous un exemple de code pour cela:

initialisation:

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

ajuster la taille 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); 
} 

changement de modèle de processus

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

tête Redimensionnement horizontal

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

espérons que cette aide, ce qui est

+0

thx mais j'étais déjà capable de le faire. Le seul problème ici est que vous devez prendre en compte la taille de la frontière. Il y a aussi quelque chose qui ne va pas avec les méthodes width() et height() du guérisseur vertical. La méthode width donne une valeur de 0 et la hauteur m'a donné quelque chose comme 259, qui était beaucoup trop grand. –

+0

l'en-tête horizontal donne cependant de bonnes valeurs. –

+0

Dans la même veine, vous pouvez utiliser la fonction 'QHeaderView :: length()': 'viewRect.setWidth (customsItemsView-> horizontalHeader() -> length());' qui a semblé fonctionner pour moi. –

0

sum(item.sizeHint()+headeroffset+border) ne fonctionne pas bien pour moi, il y a probablement un espacement entre les éléments, même si la grille est désactivée. Je fis donc le réglage de cette façon:

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

devrait fonctionner si la dernière colonne et dernière ligne est visible.

0

J'ai essayé serge_gubenko réponse mais je n'ai pas travaillé pour moi (en partie parce que je voulais modifier la hauteur et la largeur) ... donc je l'ai modifié; Pour éviter la table redimensionnée par mise en page ou widgets parents vous en aurez besoin:

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

Puis:

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

J'espère que cela aide quelqu'un.

Questions connexes