如何使用QWebPage作为QListView的委托?

时间:2013-02-16 15:50:34

标签: python qt pyqt

我正在为一个社交网络的客户工作。它是用Qt& amp;蟒蛇。 我需要将时间表放入QListView(想想Twitter或Facebook)。

但是,QListView无法呈现富文本,因此我使用QTextDocument作为委托。

class HTMLDelegate(QtGui.QStyledItemDelegate):
    def paint(self, painter, option, index):
        options = QtGui.QStyleOptionViewItemV4(option)
        self.initStyleOption(options, index)
        options.text = options.text.replace(" ", " ")

        style = QtGui.QApplication.style() if options.widget is None else options.widget.style()

        doc = QtGui.QTextDocument()
        doc.setHtml(options.text)
        doc.setTextWidth(option.rect.width())

        options.text = ""
        style.drawControl(QtGui.QStyle.CE_ItemViewItem, options, painter)

        ctx = QtGui.QAbstractTextDocumentLayout.PaintContext()

        # Highlighting text if item is selected
        #if (optionV4.state & QStyle::State_Selected)
            #ctx.palette.setColor(QPalette::Text, optionV4.palette.color(QPalette::Active, QPalette::HighlightedText));

        textRect = style.subElementRect(QtGui.QStyle.SE_ItemViewItemText, options)
        painter.save()
        painter.translate(textRect.topLeft())
        painter.setClipRect(textRect.translated(-textRect.topLeft()))
        doc.documentLayout().draw(painter, ctx)

        painter.restore()

    def sizeHint(self, option, index):
        options = QtGui.QStyleOptionViewItemV4(option)
        self.initStyleOption(options, index)

        doc = QtGui.QTextDocument()
        doc.setHtml(options.text)
        doc.setTextWidth(options.rect.width())
        return QtCore.QSize(doc.idealWidth(), (doc.size().height())) 

它有效,但它不支持所有HTML标签。

经过大量搜索,我发现QWebView,它是一个功能齐全的HTML查看器。我想将QWebPage用作QListView的委托。

所以,我试过了:

class HTMLDelegate(QtGui.QStyledItemDelegate):
    def paint(self, painter, option, index):
        options = QtGui.QStyleOptionViewItemV4(option)
        self.initStyleOption(options, index)
        options.text = options.text.replace(" ", " ")

        style = QtGui.QApplication.style() if options.widget is None else options.widget.style()

        webPage = QtWebKit.QWebPage(self)
        webFrame = webPage.mainFrame()
        webPage.setViewportSize(webPage.mainFrame().contentsSize())
        webFrame.setHtml(options.text)

        #doc.setTextWidth(option.rect.width())

        options.text = ""
        style.drawControl(QtGui.QStyle.CE_ItemViewItem, options, painter)

        #ctx = QtGui.QAbstractTextDocumentLayout.PaintContext()

        textRect = style.subElementRect(QtGui.QStyle.SE_ItemViewItemText, options)
        painter.save()
        painter.translate(textRect.topLeft())
        painter.setClipRect(textRect.translated(-textRect.topLeft()))
        webFrame.render(painter)

        painter.restore()

但它不起作用。它只显示空白项目。

我做错了什么?

或者,那种情况还有另一种解决方案吗?我发现setItemWidget()可以将许多小部件放入QListView的项目中,但它会破坏模型视图。

1 个答案:

答案 0 :(得分:0)

好的,所以我建议的原始问题是您在webPage.setViewportSize之前致电webFrame.setHtml

sizeHint很棘手。 QWebView甚至没有尝试,当然Web浏览器的工作方式是它们根据用户设置的视口大小执行布局。我建议你需要自己想出一个合理的宽度值。然后,您应该能够从contentsSize获得帧高。