12
votes

Utilisez la fenêtre / la fenêtre pour retourner axe YPainter Y

J'utilise Qt 4.7 QPainter pour dessiner des polygones, etc dans un widget. J'espère que de modifier le système de coordonnées de sorte que (0,0) est au centre de mon widget et x / y axe se comportent dans une norme « cartésien » façon (ie. Y augmente en allant « jusqu'à » et diminue va " vers le bas"). En d'autres termes, je veux que les coordonnées soient « mathématiques » -comme pas « infographie » -comme, si vous savez ce que je veux dire. : -).

Je suis en train de le faire en utilisant setViewport () et setWindow () plutôt que de le faire moi-même les mathématiques, comme il serait agréable de pouvoir appeler simplement les méthodes de dessin directement avec mes coordonnées p >

Voici ce que j'ai à ce jour: p>

// Setup coordinates
double screenWidth = width();
double screenHeight = height();

double windowWidth = 100.0;
double windowHeight = (screenHeight / screenWidth) * windowWidth;

painter.setViewport(0, 0, screenWidth, screenHeight);
painter.setWindow(-(windowWidth / 2.0), -(windowHeight / 2.0), windowWidth, windowHeight);

// Draw stuff
painter.setPen(Qt::NoPen);
painter.setBrush(Qt::blue);
painter.drawRect(-10, -10, 20, 20);


0 commentaires

4 Réponses :


26
votes

Utiliser la classe qmatrix . Il spécifie des transformations 2D. qmatrix est défini sur qpainter .

Mais rappelez-vous, dans votre cas, si vous convertissez les coordonnées de votre widget vers cartésiennes coordonnées , vous devrez mettre en place un premier point à (- 10, -10) < em> (pas à (- 10,10) comme vous l'avez mentionné) pour dessiner un rect, qui a du centre à (0,0) , car L'axe de Y grandit maintenant up et x-axe augmente maintenant droite .

Tout ce dont vous avez besoin est de transformer votre système de coordonnées de cette façon:

  • Traduire Origine de (0,0) au milieu du widget:
    texte alt

  • échelle axe y par -1 facteur:
    text alt

    Voici le code, dactylographié dans PAINTEvent () Fonction d'un widget: xxx

    résultat:
    text alt

    Mise à jour 07, 2014

    Cette question a été posée il y a longtemps et beaucoup de choses ont changé depuis. Pour ceux qui se demandent la même question aujourd'hui (débuts de 2014), ma réponse personnelle est que, puisque Qt 4.3, il est possible de résoudre le problème avec le texte qui se retourne plus facilement.

    Vous avez raison. Le texte devient également filpé car il est dessiné avec le même peintre. Vous pouvez dessiner du texte à la fin, lorsque tous les dessins retournés sont effectués, si cela est possible. Cette méthode n'est pas convinie en raison de nouveaux calculs de la position des textes. De plus, vous devrez déposer des paramètres pour peintre. Maintenant, je vous recommanderais d'utiliser qgraphicsview , en raison d'un appui considérable de la peinture 2D. Également pour chaque qgraphicsitem itemignorestransformations peut être défini, ce qui lui permet d'ignorer les transformations héritées (c'est-à-dire que sa position est toujours ancrée à son parent, mais la rotation des parents ou de la vue, Les transformations de zoom ou de cisaillement sont ignorées). Ce drapeau est utile pour garder les éléments d'étiquette de texte horizontal et non calé, de sorte qu'ils seront toujours lisibles si la vue graphique est transformée


1 commentaires

Correct, mais il faut mentionner que les textes sont également retournés. C'est surtout pas souhaité!



3
votes

La réponse ci-dessus retourne également du texte, "P" sera "B". Pour éviter que vous ayez à retourner l'axe des Y avant de tirer le texte, vous devez changer de signe sur Y-Coord pour la position du texte lorsque vous le dessinez. C'est un peu laids je pense, ou y a-t-il une meilleure façon?


0 commentaires

2
votes

Comme indiqué ci-dessus, le texte de dessin apparaît également renversé à l'envers. Il y a une solution facile pour cela, voir ci-dessous. Nous désactiverons temporairement la transformation du monde pour le dessin du texte. Notez que le texte n'est plus mis à l'échelle.

Dans votre code de peinture, nous voulons dessiner du texte sur la coordonnée qpointf p; xxx


0 commentaires

1
votes

Je devais retourner l'axe de Y afin de peindre des lignes et des polygones en utilisant QT des points définis dans les coordonnées Java. J'imagine que les autres devront faire cela dans le portage des systèmes de coordonnées Java à QT. La discussion ci-dessus était utile. Ma solution était la suivante:

painter.translate(0,height());
painter.scale(1.0, -1.0);


0 commentaires