2010-12-10 9 views
5

Estoy tratando de cambiar las dimensiones de una subclase QPushButton mientras ancla una esquina definida por el usuario (no siempre la esquina superior izquierda). QPushButton define un QFrame como su elemento primario y flota libremente en la ventana. Cuando trato de cambiar el tamaño de la subclase QPushButton en el código de la subclase, creo que me está causando problemas ya que los QPoints proporcionados por mouseEvents son locales. He intentado trabajar con myButton-> mapToGlobal (QPoint) y myButton-> mapFromGlobal, pero no creo que entiendo cómo funcionan. Una búsqueda de ejemplos me ha dejado con las manos vacías. ¿Alguien puede dar un pequeño ejemplo?Mapeo global/local Qt QPoint

Respuesta

12

Las coordenadas locales (widget) son relativas a la esquina superior izquierda del widget. Las coordenadas globales son coordenadas de pantalla. Son fácilmente convertibles, y eventos como QMouseEvent ofrecen tanto coordenadas locales (pos()) como globales (globalPos()). Si desea asignar a partir Widget A a artefacto B, puede hacer

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

O, más corto:

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

Ejemplo: Supongamos que tiene un W1 widget de alto nivel al (100110) (coordenadas de pantalla), que tiene un widget infantil w2 en (10,10) (coordenadas w1) y un evento de mouse en w2 en (20, 20) (coordenadas w2), luego la posición global del cursor del mouse es

(100,110) + (10,10) + (20,20) = (130,140) (coordenadas de pantalla)

Eso es w2-> mapToGlobal (mousePos).

W2-> mapTo (w1, MousePos) o, como w1 es el padre de w2, W2-> mapToParent (MousePos) es

(10,10) + (20,20) = (30,30) (coordenadas w1).

Puede ser más fácil si convierte todo a coordenadas globales, haga los cálculos allí y luego asigne el resultado al widget, es decir contexto en el que lo necesita.