我有一个自定义的委托用于
QTableView
,允许使用QTextDocument
显示/编辑HTML字符串。下面是一个SSCCE。
不幸的是,当我使用paint()
显示文本时,它并没有垂直居中,而是似乎顶部对齐。例如,如果我将该委托应用于第二列,但不是第一列,则表格如下所示:
我的搜索并没有揭示如何从委托内部以原则性的方式修复此问题。在我的电脑上手动添加5到option.rect.y()
可以解决问题,但我不认为这是原则性的。
是否有办法使文本垂直居中?
SSCCE
from PySide import QtGui
import sys
class HtmlTable(QtGui.QTableView):
def __init__(self, parent = None):
QtGui.QTableView.__init__(self)
model = QtGui.QStandardItemModel()
model.setHorizontalHeaderLabels(['Title', 'Summary'])
item0 = [QtGui.QStandardItem('Infinite Jest'), QtGui.QStandardItem('Hello, <i>Hal</i>')]
item00 = [QtGui.QStandardItem('Hamlet'), QtGui.QStandardItem('Best served <b>cold</b>')]
model.appendRow(item0)
model.appendRow(item00)
self.setModel(model)
self.setItemDelegate(HtmlPainter(self))
class HtmlPainter(QtGui.QStyledItemDelegate):
def __init__(self, parent=None):
QtGui.QStyledItemDelegate.__init__(self, parent)
def paint(self, painter, option, index):
if index.column() == 1:
text = index.model().data(index) #default role is display
palette = QtGui.QApplication.palette()
document = QtGui.QTextDocument()
document.setDefaultFont(option.font)
#Set text (color depends on whether selected)
if option.state & QtGui.QStyle.State_Selected:
displayString = "<font color={0}>{1}</font>".format(palette.highlightedText().color().name(), text)
document.setHtml(displayString)
else:
document.setHtml(text)
#Set background color
bgColor = palette.highlight().color() if (option.state & QtGui.QStyle.State_Selected)\
else palette.base().color()
painter.save()
painter.fillRect(option.rect, bgColor)
painter.translate(option.rect.x(), option.rect.y()) #If I add +5 it works
document.drawContents(painter)
painter.restore()
else:
QtGui.QStyledItemDelegate.paint(self, painter, option, index)
def main():
app = QtGui.QApplication(sys.argv)
myTable = HtmlTable()
myTable.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main()
sizeHint
的完整示例。我只想将我的SSCCE简化到基本点。既然这个问题看起来已经解决了,我得检查一下看我做对了没有。 :) - eric