Pregunta

necesito para personalizar el proceso de dibujo de un QGraphicsView, y así puedo reemplazar método como este los drawItems:

self.graphicsview.drawItems=self.drawer.drawItems

donde self.graphicsview es un QGraphicsView y self.drawer es una clase personalizada con un drawItems método.
En este método puedo comprobar algunas banderas para decidir cómo dibujar cada elemento, y luego llamo item.paint, como esto:

def drawItems(self, painter, items, options):
    for item in items:
        print "Processing", item
        # ... Do checking ...
        item.paint(painter, options, self.target)

self.target es QGraphicsScene del QGraphicsView.
Sin embargo, una vez que llega item.paint, se rompe fuera del lazo - sin ningún error. Si pongo condicionales alrededor de la pintura, y para cada tipo posible de QGraphicsItem pegar el código que se supone debe ser ejecutado (mirando a las fuentes de Git-Qt), todo funciona.
No es una solución muy agradable, aunque ... Y no entiendo cómo se podría incluso romper el bucle?

¿Fue útil?

Solución

Hay una excepción que se produce cuando los elementos están pintados, pero no se informó de inmediato. En mi sistema (PyQt 4.5.1, Python 2.6), no es una excepción se informa cuando el mono-parcheo el siguiente método:

def drawItems(painter, items, options):
    print len(items)
    for idx, i in enumerate(items):
        print idx, i
        if idx > 5:
            raise ValueError()

Salida:

45
0 <PyQt4.QtGui.QGraphicsPathItem object at 0x3585270>
1 <PyQt4.QtGui.QGraphicsSimpleTextItem object at 0x356ca68>
2 <PyQt4.QtGui.QGraphicsSimpleTextItem object at 0x356ce20>
3 <PyQt4.QtGui.QGraphicsSimpleTextItem object at 0x356cc88>
4 <PyQt4.QtGui.QGraphicsSimpleTextItem object at 0x356cc00>
5 <PyQt4.QtGui.QGraphicsSimpleTextItem object at 0x356caf0>
6 <PyQt4.QtGui.QGraphicsSimpleTextItem object at 0x356cb78>

Sin embargo, una vez que cerrar la aplicación, se imprime el método siguiente:

Exception ValueError: ValueError() in <module 'threading' from '/usr/lib/python2.6/threading.pyc'> ignored

He intentado imprimir threading.currentThread(), pero devuelve el mismo hilo si se llama dentro o fuera del método drawItems mono-parcheado.

En el código, esto es probablemente debido al hecho de que se pasa options (que es una lista de objetos opciones de estilo) para los elementos individuales más que el objeto opción respectiva. El uso de este código que debe dar los resultados correctos:

def drawItems(self, painter, items, options):
    for item, option in zip(items, options):
        print "Processing", item
        # ... Do checking ...
        item.paint(painter, option, self.target)

Además, usted dice que el self.target es el objeto de escena. El de paint() dice:

  

Esta función, que se suele llamar por QGraphicsView, pinta el contenido de un elemento en coordenadas locales. ... El argumento widget es opcional. Si se proporciona, al que apunta el widget que está siendo pintado en; de lo contrario, es 0. Para la pintura en caché, widget es siempre 0.

y el tipo es QWidget*. QGraphicsScene hereda de QObject y no es un widget, por lo que es probable que esto está mal, también.

Sin embargo, el hecho de que la excepción no se informa en absoluto, o no de inmediato sugiere algún juego sucio, debe comunicarse con el mantenedor.

Otros consejos

La razón por la cual el bucle sale de repente es que se produce una excepción. Python no manejarlo (No existe un bloque try:), por lo que ha pasado a la llamada (código C ++ de Qt), que no tiene ni idea acerca de las excepciones Python, por lo que ha perdido.

Añadir un try / excepto alrededor del bucle y debería ver la razón de por qué sucede esto.

Nota:. Como Python 2.4, no debe reemplazar los métodos de esta manera más

En su lugar, debe derivar una nueva clase de QGraphicsView y añadir su método drawItems() a esta nueva clase. Esto reemplazará el método original correctamente.

No se olvide de llamar super() en el método __init__! De lo contrario, su objetivo no funcionará correctamente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top