Рисование qwidget.render со смещением в QStyledItemDelegate - PullRequest
0 голосов
/ 14 июня 2011

Я пытаюсь создать делегата для отрисовки пользовательских виджетов в качестве элементов списка в режиме значков.У меня это более или менее работает, но я не могу заставить виджеты рисовать в нужном месте, кажется, они рисуются с учетом (0,0) источника в главном окне, а не источника представления списка.Что мне нужно передать, чтобы сделать виджет в нужном месте?Я знаю, что могу передать смещение ... как я могу вычислить смещение между главным окном и представлением списка?

Это мой метод рисования для моего делегата (полученный из 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()

Спасибо

/ J

Ответы [ 2 ]

1 голос
/ 15 апреля 2013

Вы можете визуализировать ваш виджет во временное растровое изображение, а затем нарисовать растровое изображение.Это решает проблему смены:

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 )
1 голос
/ 15 июня 2011

Если это кому-то пригодится, я выложу свое решение ...

Я не знаю, является ли это лучшим способом сделать это, но я вычисляю смещение, сопоставляя происхождение моего родителя с главным окном:

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

Это работает, поэтому я буду использовать его, пока не найду лучший способ сделать это.

...