2016-09-11 7 views
0

Je crée une mise en page de suivi de la colonne qui hérite de QHBoxLayout, qui alignera deux lignes modifications aux colonnes de table:Obtenez position absolue/globale de la section d'en-tête de la table tout en tenant compte de défilement horizontal

enter image description here

Pour ce faire, je calcule la position de l'écran absolu de chaque taille de section ColumnAlignedLayout::setGeometry() en utilisant ce code:

void ColumnAlignedLayout::setGeometry(const QRect &r) 
{ 
    QHBoxLayout::setGeometry(r); 
    int widgetX = parentWidget()->mapToGlobal(QPoint(0, 0)).x(); 
    int headerX = headerView->mapToGlobal(QPoint(0, 0)).x(); 
    int delta = headerX - widgetX; 
    for (int ii = 0; ii < headerView->count(); ++ii) { 
     int pos = headerView->sectionPosition(ii); 
     int size = headerView->sectionSize(ii); 

     auto item = itemAt(ii); 
     auto r = item->geometry(); 
     r.setLeft(pos + delta); 
     r.setWidth(size); 
     item->setGeometry(r); 
    } 
} 

la mise en page fonctionne déjà, sauf lorsque la table a un défilement horizontal.

enter image description here

Le projet complet est à https://github.com/sashoalm/ColumnAlignedLayout, et exécuter reproduira le problème facilement - il suffit d'élargir les colonnes jusqu'à ce que la barre de défilement horizontale apparaît, puis faites défiler jusqu'à ce que la première colonne est cachée.

headerView->mapToGlobal(QPoint(0, 0)).x(); donne la même valeur si la table a été redimensionnée ou non.

J'ai trouvé une question similaire mais c'est pour l'objectif C, et cela ne tient pas compte du défilement qui est mon problème.

how to get the absolute position of a section header in tableview?

Répondre

0

Finalement, je suis entré dans la source de Qt pour leur événement de peinture, en supposant qu'ils auraient besoin de la position réelle pour elle, et ils utilisent sectionViewportPosition(), qui donne la position de la section réelle par rapport au supérieur gauche du QTableWidget/QTableView coin.

Vous pouvez l'utiliser avec mapToGlobal() pour obtenir la position horizontale globale de la section.