Pregunta

Estoy tratando de crear un delegado para dibujar widgets personalizados como elementos en un listview en el modo de icono. Lo tengo más o menos funcionando, pero no puedo hacer que los widgets dibujen en el lugar correcto, parece que se están dibujando considerando (0,0) el origen en la ventana principal, no el origen de la vista de lista. ¿Qué necesito pasar para representar el widget en el lugar correcto? Sé que puedo pasar una compensación ... ¿cómo puedo calcular el desplazamiento entre la ventana principal y la vista de lista?

Este es mi método de pintura en mi delegado (derivado de QStyledItemDelegate)

def paint(self, painter, option, index):

        painter.save()

        if option.state & QStyle.State_Selected:
            painter.fillRect(option.rect, option.palette.highlight());

        model = index.model()
        myWidget = model.listdata[index.row()]


        myWidget.setGeometry(option.rect)

        myWidget.render(painter, option.rect.topLeft() )

        painter.restore()

Gracias

/J

¿Fue útil?

Solución

En caso de que esto sea útil para alguien más, publicaré mi solución ...

No sé si esta es la mejor manera de hacerlo, pero estoy calculando la compensación mapeando el origen de mis padres hasta la ventana principal:

offset = self._parent.mapTo(self._mainWindow, QPoint(0,0))
myWidget.render(painter, option.rect.topLeft() + offset)

Funciona, así que lo usaré hasta que encuentre una mejor manera para hacer esto.

Otros consejos

Puede convertir su widget en un PIXMAP temporal y luego dibujar el PIXMAP en su lugar. Que resuelve el problema de turno:

def paint(self, painter, option, index):
        pic = QPixmap( option.rect.width(), option.rect.height() )
        w = ItemWidget()
        w.setGeometry( option.rect )
        w.render(pic)            
        painter.drawPixmap( option.rect, pic )
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top