2010-11-27 2 views
0

Disons que j'ai un QGrahicsRectItem item avec item.width = 10 et item.height = 10. Son coin supérieur gauche est à (0,0). item.BoundingRect() devrait retourner un RectF(0,0,9,9) mais il renvoie un RectF(0,0,10,10)QGraphicsRectItem :: boundingRect() retourne un QRectF qui est 1px plus grand que ce qu'il devrait être

Vous pouvez le tester avec le code suivant:

QGraphicsRectItem* item = new QGraphicsRectItem(0,0,10,10); 
qDebug() << item->boundingRect().width();   // 10, OK 
qDebug() << item->boundingRect().height();   // 10, OK 
qDebug() << item->boundingRect().topLeft().x();  // 0, OK 
qDebug() << item->boundingRect().topLeft().y();  // 0, OK 
qDebug() << item->boundingRect().bottomRight().x(); // 10, WHY? should be 9 
qDebug() << item->boundingRect().bottomRight().y(); // 10, WHY? should be 9 

Alors retourne boundingRect() un RectF qui a une largeur et une hauteur de 11px, bien que la largeur () et la hauteur() prétendent que c'est 10 pour les deux.

Qu'est-ce qui ne va pas?

Répondre

0

Je ne vois rien de mal à cela. J'imagine comme ça (remplacer 10 pour 3)

0 1 2 3 
0 |==|==|==| 
    | 1| 2| 3| 
1 |==|==|==| 
    | 1| 2| 3| 
2 |==|==|==| 
    | 1| 2| 3| 
3 |==|==|==| 

Il a la largeur et la hauteur 3 et le coin inférieur gauche est à [3,3], est-ce pas? :)

Edit:

Here vous pouvez voir comment il est effectivement calculé (avis, qu'il est calculé différemment pour QRect et QRectF pour des raisons historiques (c'est-ce qu'affirment les docs)).

Le système de coordonnées QRect et le système de coordonnées QRectF.

+0

Mais le RectF est toujours 11px de large et pas 10. Ce n'est pas une question de perspective mais un fait qui conduit à des problèmes. C'est le but. Si j'utilise boundingRect() pour attraper des événements de souris dans mes objets 10px, j'obtiendrai également des événements, qui sont à 1px de l'élément. – problemofficer

+0

Que voulez-vous dire? Est-il rendu 11px de large? Parce que le débogage dit clairement que c'est 10px de large. Donc le boundingRect() est vraiment large de 10px (et rect() dans ce cas). – Palmik

+0

Un élément graphique a un système de coordonnées continues, et non des pixels. En coordonnées réelles, la longueur de la ligne qui va de 0 à 10 est de 10 et non de 11. Lorsque la scène est rendue, les éléments doivent encore être rastérisés, donc vous ne pouvez pas prédire la taille exacte en pixels, et ne devrait pas compter dessus. Essayez d'utiliser la souris de QGraphicsScene * Les gestionnaires d'événements passant QGraphicsSceneMouseEvents. –

0

Je pense que vous confondez les coordonnées avec les tableaux ici. Les résultats ci-dessus sont corrects.

Si vous faites un pas de 10 mètres d'un mur et que vous tournez autour pour mesurer la distance, vous devriez être à 10 mètres, n'est-ce pas? Non 9 - parce que vous ne pouvez pas être à l'intérieur du mur avant de faire le premier pas. Cela impliquerait également que le mur a 1 mètre d'épaisseur.

Questions connexes