HTML QTableView 渲染器 - 字体大小发生了什么变化?
HTML renderer for QTableView - what's happening to the font size?
This answer(由我从那里的其他答案更新)关于如何在 QTableView
中呈现 HTML 的问题肯定会产生标记文本外观。
但是字体大小有问题。请参阅此 MCE:第 0 列使用标准 paint
和 sizeHint
方法。您可以单击右侧的单元格以查看 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, option, 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, 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, option, 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, 20, 800, 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文件,除非你真的知道你在做什么以及为什么,它被认为不好的做法和提供这样做的代码不是一件好事。
This answer(由我从那里的其他答案更新)关于如何在 QTableView
中呈现 HTML 的问题肯定会产生标记文本外观。
但是字体大小有问题。请参阅此 MCE:第 0 列使用标准 paint
和 sizeHint
方法。您可以单击右侧的单元格以查看 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, option, 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, 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, option, 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, 20, 800, 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文件,除非你真的知道你在做什么以及为什么,它被认为不好的做法和提供这样做的代码不是一件好事。