tags:

views:

34

answers:

1

I want to use a QGraphicWebView inside a delegate to render a QTableView cell, but I just don't know what to do with the QStyleOptionGraphicsItem parameter the paint() method requires. How to build it up / where should I retrieve it? I'm using this code as reference, so the paint() method should be something like this:

def paint(self, painter, option, index):
    web = QGraphicsWebView()
    web.setHtml(some_html_text)
    web.page().viewportSize().setWidth(option.rect.width())
    painter.save()
    painter.translate(option.rect.topLeft());
    painter.setClipRect(option.rect.translated(-option.rect.topLeft()))
    web.paint(painter, ??????) # what here?
    painter.restore()

Any advice?

A: 

I'll assume that you don't really need QGraphicsWebView and that QWebView is sufficient.

It's important to keep in mind that you're not expected to call QWidget::paintEvent() yourself. Given that constraint, you'll want to use a helper class that can render on a paint device or render using a given painter. QWebFrame has one such method in the form of its render function. Based off of your linked-to example, the following should work:

class HTMLDelegate(QStyledItemDelegate):

    def paint(self, painter, option, index):
        model = index.model()
        record = model.listdata[index.row()]

        # don't instantiate every time, so move this out
        # to the class level
        web = QWebView() 
        web.setHtml(record)
        web.page().viewportSize().setWidth(option.rect.width())

        painter.save()
        painter.translate(option.rect.topLeft());
        painter.setClipRect(option.rect.translated(-option.rect.topLeft()))
        web.page().mainFrame().render(painter)
        painter.restore()
Kaleb Pederson
thank you, my setwidth() part is not really setting the page size, but the render part works good.
Giorgio Gelardi