2010-11-23 20 views
7

Estoy intentando hacer uso de una combinación de cursores personalizados y cursores preestablecidos para mi QGraphicsView. En mi implementación, hemos creado una noción de "modos" para la vista. Lo que significa que dependiendo del "modo" en que se encuentre el usuario, sucederán cosas diferentes con el clic izquierdo o haciendo clic con el botón izquierdo del mouse. De todos modos, nada de eso es el problema, solo el contexto.QGraphicsView y cursores personalizados

El problema surge cuando trato de cambiar el cursor para cada modo. Por ejemplo, para el modo 1, queremos mostrar el cursor de flecha normal, pero para el modo 2, queremos utilizar un mapa de píxeles personalizado. Al parecer simple llamamos al graphicsview->viewport()->setCursor(Qt::QArrowCursor) cuando estamos cambiando al modo 1, y graphicsview->viewport()->setCursor(our custom cursor) para el modo 2. Excepto que no funciona en absoluto.

En primer lugar, el cursor no cambia al cursor personalizado. Ese es el primer problema. Sin embargo, si a través de otra operación el modo de arrastre de la vista de gráficos se establece en ScrollHandDrag, el cursor cambiará al cursor personalizado una vez que se complete la operación de arrastre. Extraño. Pero la trama se complica ... Una vez que cambiamos al cursor personalizado, nunca se puede volver a cambiar al ArrorCursor sin importar cuántas veces llamemos al setCursor(Qt::QArrowCursor). tampoco parece importar si llamo a setCursor en la ventana gráfica o en la vista de gráficos.

Así que, solo por diversión, agregue una llamada al graphicsview->unsetCursor() justo antes de que deseemos cambiar el cursor, y eso al menos rectifica el segundo problema. El cursor cambia muy bien siempre que hagamos un pequeño HandDragging en el medio. Mejor, pero ciertamente no es óptimo. Sin embargo, debe tenerse en cuenta que hacer el unsetCursor en la ventana gráfica no funciona. se debe hacer absolutamente en la vista de gráficos, independientemente del hecho de que estemos colocando el cursor en la ventana gráfica.

parchear completamente sobre el problema que he añadido estas dos líneas después de configurar el cursor:

graphicsview->setDragMode(QGraphicsView::ScrollHandDrag); 
graphicsview->setDragMode(QGraphicsView::NoDrag); 

que funciona, pero gads vosotros !! Entonces algo mágico está sucediendo dentro de estos dos métodos que corrige el problema, pero mirando el código no veo qué. Algo relacionado con el hecho de que el modo de arrastre está cambiando el cursor, me imagino.

Para completar, también debo mencionar que lo que desencadena el cambio de modo, es un QPushButton que se ha agregado a la escena usando QGraphicsScene->addWidget(). No sé si eso tiene algo que ver con eso, pero nunca se sabe.

Espero que alguien pueda aclarar por qué tengo que hacer estas llamadas aparentemente aleatorias. No creo que esté haciendo nada mal en ningún lado. Gracias de antemano por cualquier ayuda.

EDITAR: Aquí hay un ejemplo de código real con los parches de cursor como se describió anteriormente. Puede mirar y/o descargarlos desde el siguiente enlace. Fue un poco largo para pegar aquí. Incluí el marco en el que cambian los cursores, porque tengo la extraña sensación de que eso es importante de alguna manera.

https://gist.github.com/712654

El código donde radica el problema está en MyGraphicsView.cpp a partir de la línea 104. Aquí es donde el cursor se encuentra en la vista gráfica. Es exactamente como se describió anteriormente.

Tenga en cuenta que con los parches muy feos en su lugar los cursores funcionan, más o menos. Sin esas líneas, verá muy claramente los problemas enumerados en la publicación anterior.

También se incluye en el enlace, es todo el código de una ventana principal que utiliza la vista, etc ...lo único que falta son las imágenes que estoy usando. Pero las imágenes en sí mismas no importan, cualquier png 16x16 servirá.

+2

Uso de graphicsview-> setCursor (...) y graphicsview-> viewport() -> setCursor (...) funciona para mí. ¿Podría proporcionar un caso de prueba mínimo que muestre el comportamiento anómalo que describe? –

+1

La pregunta es antigua, pero solo para los lectores futuros, puede ver mi sugerencia en una pregunta similar, usar un temporizador para establecer la forma del cursor: [link] (http://stackoverflow.com/questions/5254404/ ¿Por qué-tengo-tengo-problemas-cambiando-mouse-cursores-en-mi-implementación-de-un-interactivo/5348648 # 5348648) –

+0

Envié un informe de error debido a problemas con esto: https: // bugreports. qt.io/browse/QTBUG-60752 –

Respuesta

4

he añadido un museReleaseEvent para resolver un problema similar ...

void mouseReleaseEvent(QMouseEvent *event) { 
    QGraphicsView::mouseReleaseEvent(event); 
    viewport()->setCursor(Qt::CrossCursor); 
} 

Esto restablecerá el cursor después del evento de arrastre es completa, durante el arrastre de la mano será visible, lo cual tiene sentido.

4

Mi solución:

view->setDragMode(QGraphicsView::ScrollHandDrag); 
QApplication::setOverrideCursor(Qt::ArrowCursor); 
Cuestiones relacionadas