2017-03-03 2 views
0

Je me suis retrouvé dans une erreur de configuration d'une transformation QPainter. J'ai lu la documentation de Qt, mais brainfog est dans le chemin.Transformation des coordonnées de l'écran logique QWidget/QPainter

void MyWidget::paintEvent (QPaintEvent *) { 
    QPainter painter (this); 
    // ... 

Je veux rendre une scène qui est décrite en coordonnées logiques. La scène comprend une "scène" qui est le rectangle à rendre. La scène est spécifiée en coordonnées logiques. Le widget devrait avoir une fenêtre (est que la terminologie correcte?) Qui

  • est aussi grand que possible sans dépasser les limites de la scène, et
  • dispose d'un centre commun avec la scène.

enter image description here

Dans la situation au-dessus du stade serait décrit par quelque chose comme

QRectF stage_rect (QPointF(0.2,5.1), QPointF(6.5,1.9)); 

si je mis en place la transformation et appelez

painter.drawText (1.2, 2.2, "abc"); 

il devrait apparaître dans la en bas à gauche du widget comme indiqué ci-dessus - c'est-à-dire, les coordonnées logiques augmentent vers le haut, le plein la hauteur de la scène est montrée dans le widget, et la scène est rognée horizontalement pour conserver le rapport d'aspect (bien qu'il soit possible que le widget soit trop large/court, dans ce cas la scène serait recadrée verticalement).

Quelle transformation dois-je appliquer au QPainter pour ajuster la fenêtre fermement dans la scène?

Répondre

1

Le système de coordonnées de Qt a la direction positive vers le bas et vers la droite plutôt que vers le haut et vers la droite, ce qui est ce que vous voulez. Pour ce faire, réglez votre facteur d'échelle Y dans la transformation sur -1 et le facteur d'échelle X sur 1; cela retournera les coordonnées Y mais pas le X. Cependant, si vous appliquez cette transformation au peintre, je crois que vous finirez avec votre texte à l'envers. Ce que vous voulez probablement, c'est de transformer les coordonnées et ensuite passer les coordonnées transformées au peintre.

+0

Pour ajouter au dernier point: vous pouvez utiliser un objet 'QTransform' avec la transformation décrite, puis utiliser ses méthodes' map() 'pour gérer les valeurs de' QPointF', etc –

+0

Oui, merci d'avoir signalé cela . Excellent point. – goug