2017-09-19 4 views
0

Je veux obtenir les coordonnées d'un QRect ou d'un QPoint dans un widget pour déterminer si cet objet chevauche le bord et serait dessiné à l'extérieur du widget.Qt - Récupère la position du rectangle dans le widget après translate()

Le programme suivant est juste un programme de test pour montrer mon problème. Il y a une fenêtre dans laquelle un rectangle noir est dessiné. En utilisant translate() de QPainter, je déplace le système de coordonnées. Après cela, je ne peux pas obtenir les coordonnées correctes du rectangle.

Je pouvais garder une trace de toutes les manipulations du système de coordonnées (translate(), rotate(), scale()) mais ce n'est pas une bonne solution. Existe-t-il un moyen plus simple d'obtenir la position du rectangle par rapport au coin supérieur gauche du widget?

#include "widget.h" 
#include <QPainter> 
#include <iostream> 

Widget::Widget(QWidget *parent)  
    : QWidget(parent) 
{ 

} 

void Widget::paintEvent(QPaintEvent *) 
{ 
    QPainter painter(this);  
    painter.translate(width()/2, height()/2); 

    QRect rectangle(100, 50, 200, 100); 

    std::cout << "width(): " << this->width() << "\theight(): " << this->height() 
       << "\trecLeft X: " << rectangle.x() << "\trecTop Y: " << rectangle.y() 
       << std::endl; 
    //Output: width(): 960 height(): 432 recLeft X: 100 recTop Y: 50 
} 

Ce que je woul aime obtenir est:

recLeft X: 580(width()/2+100) recTop Y: 266(height()/2+50)

+0

Êtes-vous sûr que la traduction du peintre affecte également les coordonnées du rectangle? – vahancho

Répondre

0

Vous pouvez obtenir la matrice de transformation du peintre et l'appliquer à votre rectangle. Cela devrait être quelque chose comme ceci:

QTransform trans= painter.combinedTransform(); 
QRect transformed = trans.mapRect(rectangle); 
+0

Un 'QRectangle' est réellement mappé dans un' QPolygon'. Dans ce cas, vous pouvez utiliser 'boundingRect'. –

+0

@MatteoItalia Vous avez raison, corrigé l'exemple –

+0

Vous pouvez supprimer le constructeur 'QPolygon', il y a une surcharge' map' qui prend un 'QRectangle' et renvoie un 'QPolygon'. –