Domanda

Sto cercando di creare un delegato per disegnare widget personalizzati come elementi in una Vervatta Elenco in modalità icona. L'ho più o meno funzionante, ma non riesco a far disegnare i widget nel posto giusto, sembra che vengano disegnati considerando (0,0) l'origine sulla finestra principale non l'origine della vista dell'elenco. Cosa devo passare per rendere il widget nel posto giusto? So di poter passare un offset ... come posso calcolare l'offset tra la finestra principale e laview List?

Questo è il mio metodo di verniciatura sul mio delegato (derivato da 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()

Grazie

/J

È stato utile?

Soluzione

Nel caso in cui questo sia utile per qualcun altro posterò la mia soluzione ...

Non so se questo è il modo migliore per farlo, ma sto calcolando l'offset mappando l'orgine del mio genitore alla finestra principale:

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

Funziona, quindi lo userò fino a quando non troverò un modo migliore per farlo.

Altri suggerimenti

Puoi rendere il tuo widget in un figo temporaneo e quindi disegnare invece la mamap. Ciò risolve il problema del 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 )
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top