pyqt qstyleditemdelegate自动换行和html

时间:2017-01-20 09:45:40

标签: python qt pyqt

网上常见的问题是如何在qlistview中使用qstyleditemdelegate显示html。通常的答案是以下代码https://stackoverflow.com/a/5443112/2033030

的变体
class HTMLDelegate(QtGui.QStyledItemDelegate):
    def paint(self, painter, option, index):
        options = QtGui.QStyleOptionViewItemV4(option)
        self.initStyleOption(options,index)

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

        doc = QtGui.QTextDocument()
        doc.setHtml(options.text)

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

        ctx = QtGui.QAbstractTextDocumentLayout.PaintContext()
        if option.state & QStyle.State_Selected:
            ctx.palette.setColor(QPalette.Text, option.palette.color(QPalette.Active, QPalette.HighlightedText))
        else:
            ctx.palette.setColor(QPalette.Text, option.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())

这也是我在没有真正了解它的情况下使用的。所以我的主要问题是如何启用自动换行?我尝试过很多东西,但从未做过。

第二个问题是,有人能解释我代码的作用,在我看来有点怀疑。首先它从原始选项参数创建一个optionS var,但是下面的代码似乎使用了一个和另一个ramdomly,所以我怀疑我们可以只使用选项参数而不进行更改。那么它需要在paint和sizeHint中创建两次QTextDocument。然后在DrawControl中使用该样式,但在绘制QTextDocument时不使用....

我确实在一篇文章中保留了这两个问题,因此我们希望能够共同制定一个有意义的示例代码,并且可以被许多人用作起点。

1 个答案:

答案 0 :(得分:0)

解决方案是为TextDocument设置文本长度

FileMode

但这非常复杂,所以我们恢复使用QListWidgets,现在使用QML