PyQt / Qt,带有自定义委托的表格视图以使用省略号来处理文本溢出单元格

Posted

技术标签:

【中文标题】PyQt / Qt,带有自定义委托的表格视图以使用省略号来处理文本溢出单元格【英文标题】:PyQt / Qt, tableview with custom delegate to use ellipsis for text overflowing cell 【发布时间】:2015-06-17 13:48:16 【问题描述】:

没有自定义委托一切正常:

但我的 tableview 显示搜索结果,部分文本需要加粗以指示它与搜索查询匹配的位置。

一旦我使用委托使 html 标记工作,溢出单元格的文本不会被剪切并替换为省略号:

这是我的代表:

class HTMLDelegate(QStyledItemDelegate):
def __init__(self, parent=None):
    super().__init__()
    self.doc = QTextDocument(self)

def paint(self, painter, option, index):
    painter.save()

    options = QStyleOptionViewItem(option)
    self.initStyleOption(options, index)

    self.doc.setHtml(options.text)
    options.text = ""

    style = QApplication.style() if options.widget is None \
        else options.widget.style()
    style.drawControl(QStyle.CE_ItemViewItem, options, painter)

    ctx = QAbstractTextDocumentLayout.PaintContext()

    if option.state & QStyle.State_Selected:
        ctx.palette.setColor(QPalette.Text, option.palette.color(
                             QPalette.Active, QPalette.HighlightedText))

    textRect = style.subElementRect(QStyle.SE_ItemViewItemText, options)
    #textRect.adjust(0, 0, 0, 0)
    painter.translate(textRect.topLeft())
    self.doc.documentLayout().draw(painter, ctx)

    painter.restore()

def sizeHint(self, option, index):
    return QSize(self.doc.idealWidth(), self.doc.size().height())

如果我要添加一行

self.doc.setTextWidth(option.rect.width())

它将文本剪切到另一行(我增加了行高以显示它):

【问题讨论】:

【参考方案1】:
painter.setClipRect(textRect.translated(-textRect.topLeft()))

我以为我的代表中有它,它在这里的所有其他答案中都有,它正确地进行了剪辑,虽然没有花哨的省略号,但我想没关系。 我之前假设我必须启用一些值才能获得剪辑省略号,但我开始看到它可能比这要复杂得多,我实际上可能需要根据区域矩形编辑文本本身 - vs文本宽度在每列调整大小或一些东西上进行调整

哦,我多么希望他们能选择使用默认委托启用 html 富文本

【讨论】:

以上是关于PyQt / Qt,带有自定义委托的表格视图以使用省略号来处理文本溢出单元格的主要内容,如果未能解决你的问题,请参考以下文章

Qt5 / PyQt5 : 带有 QML 前端和 Python 后端的自定义 QML 组件

26.QT-模型视图之自定义委托

26.QT-模型视图之自定义委托

带有自定义滚动条的 QML Listview

PyQt中复选框的ListView

模型数据未更改时刷新视图(Qt/PySide/PyQt)?