2010-12-10 19 views
5

Je suis en train de modifier les dimensions d'une sous-classe QPushButton tout en ancrant un coin défini par l'utilisateur (pas toujours le coin en haut à gauche). Le QPushButton définit un QFrame comme son parent, et flotte librement dans la fenêtre. Lorsque j'essaie de changer la taille de la sous-classe QPushButton dans le code de la sous-classe, je crois que cela me cause des problèmes car les QPoints fournis par mouseEvents sont locaux. J'ai essayé de travailler avec les myButton-> mapToGlobal (QPoint) et myButton-> mapFromGlobal mais je ne comprends pas que je pense tout à fait comment ils fonctionnent. Une recherche d'exemples m'a laissé les mains vides. Quelqu'un peut-il fournir un court exemple?Qt QPoint cartographie globale/locale

Répondre

12

coordonnées locales (widget) sont par rapport au coin supérieur gauche du widget. Les coordonnées globales sont des coordonnées d'écran. Ils sont facilement convertibles, et des événements comme QMouseEvent offrent à la fois des coordonnées locales (pos()) et globales (globalPos()). Si vous voulez la carte de Widget A à Widget B, vous pouvez faire

const QPoint global = a->mapToGlobal(localPosInA); 
const QPoint localInB = b->mapFromGlobal(global); 

Ou, plus court:

const QPoint localInB = a->mapTo(b, localPosInA); 

Exemple: Supposons que vous avez un widget de haut niveau w1 à (100110) (vue coordonnées), qui a un widget fils w2 à (10,10) (coordonnées w1) et un événement de souris dans w2 à (20, 20) (w2 coordonnées), la position globale du curseur de la souris est

(100110) + (10,10) + (20,20) = (130140) (coordonnées d'écran)

C'est F2-> mapToGlobal (MousePos).

W2-> mapTo (w1, MousePos) ou, selon w1 w2 est le parent de, W2-> mapToParent (MousePos) est

(10,10) + (20,20) = (30,30) (w1 coordonnées).

Il peut être plus simple si vous convertissez tout en coordonnées globales, y faites les calculs, puis mappez le résultat au widget, c'est-à-dire le contexte dont vous avez besoin.