2017-01-20 7 views
1

qlistviewにqstyleditemdelegateを使ってhtmlを表示する方法はよくある質問です。いつもの答えは、これは私が実際にそれを理解せずに使用したものもあり、次のコードhttps://stackoverflow.com/a/5443112/2033030pyqt qstyleditemdelegate word wrapとhtml

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()) 

の変種です。だから私の主な質問は、単語ラップを有効にする方法ですか?私は多くのことを試みましたが、決してそれを作ったことはありません。

第2の問題は、コードが何をしているのか誰かが私に説明することができます、それは私の目で少し疑わしいです。最初に、元のオプションパラメータからoptionS varを作成しますが、下のコードは矛盾しているようですので、変更せずにオプションパラメータを使用することができます。 QTextDocumentをpaintとsizeHintの両方で2回作成する必要があります。その後、スタイルはDrawControlで使用されますが、QTextDocumentを描画するときは使用されません。

始点。

答えて

0

solutioがTextDocument

doc.setTextWidth(options.rect.width()) 

のためのテキストの長さを設定することでした。しかし、これは私たちがQListWidgetsを使用してに戻っ非常に複雑であり、現在QML

を使用