0

我正在尝试创建一个委托以将自定义小部件绘制为图标模式下列表视图中的元素。我或多或少地工作,但我无法让小部件在正确的位置绘制,似乎考虑到主窗口上的(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

4

2 回答 2

1

如果这对其他人有用,我将发布我的解决方案......

我不知道这是否是最好的方法,但我通过将父级的原点映射到主窗口来计算偏移量:

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

它有效,所以我会一直使用它,直到找到更好的方法。

于 2011-06-14T21:43:19.617 回答
1

您可以将 Widget 渲染为临时像素图,然后改为绘制像素图。这解决了轮班问题:

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 )
于 2013-04-15T12:01:31.090 回答