微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

QTableView 的 HTML 渲染器 - 字体大小发生了什么变化?

如何解决QTableView 的 HTML 渲染器 - 字体大小发生了什么变化?

This answer(由我从那里的其他答案更新)到有关如何在 QTableView 中呈现 HTML 的问题肯定会产生标记文本外观。

但是字体大小有问题。请参阅此 MCE:第 0 列使用标准 paintsizeHint 方法。您可以单击右侧的单元格以查看 print 语句表示这是 12 号字体。但它不是那样显示的。

from PyQt5 import QtWidgets,QtCore,QtGui
import sys

class Ui_MainWindow(object):
    def setupUi(self,MainWindow):
        MainWindow.resize(1000,500)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.verticalLayoutWidget = QtWidgets.QWidget(self.centralwidget)
        self.verticalLayoutWidget.setGeometry(QtCore.QRect(20,20,800,300))
        self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
        self.table_view = QtWidgets.QTableView(self.verticalLayoutWidget)
        self.table_view.horizontalHeader().setStretchLastSection(True)
        
        class HTMLDelegate( QtWidgets.qstyledItemDelegate ):
            def __init__( self ):
                super().__init__()
                self.doc = QtGui.QTextDocument()
        
            def paint(self,painter,option,index):
                # default paint op in col 0
                if index.column() == 0:
                    super().paint(painter,index)
                    return
                
                options = QtWidgets.qstyleOptionViewItem(option)
                print( f'options {options} font {options.font} size {options.font.pointSize()} F {options.font.pointSizef()}')
                self.initStyleOption(options,index)
                painter.save()
                self.doc.setTextWidth(options.rect.width())                
                self.doc.setHtml(options.text)
                options.text = ''
                options.widget.style().drawControl(QtWidgets.qstyle.CE_ItemViewItem,options,painter)
                painter.translate(options.rect.left(),options.rect.top())
                clip = QtCore.QRectF(0,options.rect.width(),options.rect.height())
                painter.setClipRect(clip)
                ctx = QtGui.QAbstractTextDocumentLayout.PaintContext()
                ctx.clip = clip
                self.doc.documentLayout().draw(painter,ctx)
                painter.restore()
        
            def sizeHint( self,index ):
                # default size hint in col 0
                if index.column() == 0:
                    return super().sizeHint(option,index)
                
                print( f'option {option}' ) 
                options = QtWidgets.qstyleOptionViewItem(option)
                print( f'options {options} font {options.font} size {options.font.pointSize()} F {options.font.pointSizef()}')
        
                self.initStyleOption(option,index)
                self.doc.setHtml(option.text)
                self.doc.setTextWidth(option.rect.width())
                return QtCore.QSize(self.doc.idealWidth(),self.doc.size().height())
    
        self.table_view.setItemDelegate(HTMLDelegate())
        
        # nice big font
        font = QtGui.QFont()
        font.setPointSize(12)
        self.table_view.setFont(font)
        
        self.table_view.setGeometry(QtCore.QRect(20,300))
        self.verticalLayout.addWidget(self.table_view)
        self.table_view.setModel(QtGui.QStandardItemmodel() )
        self.table_view.model().appendRow([QtGui.QStandardItem('no markup'),QtGui.QStandardItem('here is some <strong>marked up</strong> html <em>text</em>'),])
        MainWindow.setCentralWidget(self.centralwidget)

class MainWindow( QtWidgets.QMainWindow ):
    def __init__(self):
        super(MainWindow,self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

app = QtWidgets.QApplication(sys.argv)
application = MainWindow()
application.show()
sys.exit(app.exec())

解决方法

如果你不使用它,检查 options.font 是没有意义的:你改变了小部件上的字体,但 QTextDocument 无法知道任何关于那个。

只需使用选项设置正确的字体:

    def paint(self,painter,option,index):
        # ...
        self.doc.setDefaultFont(options.font)
        # ...

永远不要修改 pyuic 文件,除非您真的知道自己在做什么以及为什么这样做,这被认为是不好的做法,并且提供这样做的代码不是好东西。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。