qt - 使用委托(delegate) (PySide/Qt/PyQt) 将项目的文本垂直居中

标签 qt pyqt pyside

我有一个 QTableView 的自定义委托(delegate),它允许显示/编辑 html 字符串(使用 QTextDocument)。下面有个SSCCE。

不幸的是,当我使用 paint() 显示文本时,它不是垂直居中,而是顶部对齐。例如,如果我将委托(delegate)应用于第二列,而不是第一列,则表格如下所示:

the problem

我的搜索没有透露任何有关如何以原则性方式从委托(delegate)内部解决此问题的信息。手动将 5 添加到 option.rect.y() 可以在我的计算机上运行,​​但我认为这不是原则性的。

有没有办法让文本垂直居中?

中南合作商会

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

最佳答案

您应该使用QTextDocument::setTextWidth 设置文档的宽度。这允许您确定文本高度并使用它来计算偏移量:

document.setTextWidth(option.rect.width())
offset_y = (option.rect.height() - document.size().height())/2
painter.translate(option.rect.x(), option.rect.y() + offset_y) 
document.drawContents(painter) 

设置文本宽度也是必要的,否则当列不够宽时,文本将无法换行。

您可能需要重新实现 sizeHint 以根据文档大小计算首选宽度和高度。

关于qt - 使用委托(delegate) (PySide/Qt/PyQt) 将项目的文本垂直居中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32909349/

相关文章:

c++ - 在 Qt 中创建的 GUI 滞后(由 QTime 验证)

python - PyQT 和线程

python - 如何使用QFileSystemModel过滤多个目录并显示在QTreeView上?

c++ - QFileSystemModel - 增量更新/抢先更新

javascript - QML Javascript "console.log"与 UTF-8

python - pyqt qthread 中的错误未打印

python - 在 PyQt 中避免崩溃/挂起的良好做法是什么?

python - 装饰器来代替重复的面向对象代码?

qt - Qt qrc文件中的注释