web-dev-qa-db-fra.com

Redimensionnement automatique des colonnes à la taille de QTableView

Je suis nouveau sur Qt et je viens de réussir à faire fonctionner QTableView avec mon modèle. Il a fixé 3 colonnes. Lorsque j'ouvre une fenêtre, cela semble correct, mais lorsque je redimensionne la fenêtre, QTableView lui-même est redimensionné mais la largeur des colonnes reste la même. Existe-t-il un moyen intégré de le faire fonctionner? Je veux que les colonnes soient redimensionnées pour s'adapter aux bords de QTableView chaque fois que la fenêtre est redimensionnée.

24
khajvah

Il existe un indicateur d'en-tête pour garantir que la dernière colonne de QTableView remplit son parent si elle est redimensionnée. Vous pouvez le définir comme ceci:

table_view->horizontalHeader()->setStretchLastSection(true);

Cependant, cela ne redimensionne pas les autres colonnes proportionnellement. Si vous souhaitez également le faire, vous pouvez le gérer à l'intérieur de l'événement resizeEvent de votre parent:

void QParent::resizeEvent(QResizeEvent *event) {
    table_view->setColumnWidth(0, this->width()/3);
    table_view->setColumnWidth(1, this->width()/3);
    table_view->setColumnWidth(2, this->width()/3);

    QMainWindow::resizeEvent(event);
}

La classe QParent est une sous-classe de QMainWindow.

27
Davy Jones

Ce code étire également chaque colonne afin qu'elles correspondent à la largeur de la table.

table->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);

Documents:

52
frogatto

Les widgets QTableView , QTreeView et leurs classes dérivées (telles que QTableWidget ) ont ces deux méthodes utiles:

QHeaderView* horizontalHeader() const;
QHeaderView* verticalHeader() const;

Si vous ouvrez la documentation d'une classe QHeaderView , vous trouverez des méthodes qui configurent l'apparence et le comportement de l'en-tête de ligne ou de colonne pour les vues d'élément. Vous pouvez résoudre votre problème par l'une des méthodes suivantes:

  1. void QHeaderView :: stretchLastSection (bool stretch)
    Comme Davy Jones mentionné.

    Exemple:

    QTableView *table = new QTableView();  
    table->horizontalHeader()->setStretchLastSection(true);
    
  2. void QHeaderView :: setResizeMode (mode ResizeMode)
    En mode , vous pouvez définir QHeaderView :: Stretch ou QHeaderView :: ResizeToContents.
    Malheureusement, cette méthode a un inconvénient - après son application, vous ne pourrez pas modifier la taille des colonnes (ou des lignes) manuellement (dans l'interface graphique) ou par programme.

    Exemple:

    QTableView *table = new QTableView();  
    table->horizontalHeader()->setResizeMode(QHeaderView::Stretch);
    
4
iamantony