如何重新实现委托中粗体文本的sizeHint? (QT)

时间:2014-12-11 21:56:56

标签: qt pyqt pyside

短版

运行resizeColumnsToContents适用于常规文本,但是当我将文本更改为粗体时,列太窄。如何在我的自定义委托中修复sizeHint以考虑我的文字是否为粗体?

详情

我正在使用自定义委托来使列中的文本变为粗体。为此,在委托的paint方法中,在感兴趣的列中,我只运行option.font.setWeight(QtGui.QFont.Bold)

但是,在将列重新调整为内容时,带有粗体文本的列太窄。我尝试在委托中重新实现sizeHint,如下所示,但它产生的列与默认实现的大小完全相同:

def sizeHint(self, option, index):
    fontMetrics = option.fontMetrics  
    if index.column() == 0:
        text = index.model().data(index)
        document = QtGui.QTextDocument(text)
        document.setDefaultFont(option.font)
        return QtCore.QSize(document.idealWidth(), fontMetrics.height())
    return QtGui.QStyledItemDelegate.sizeHint(self, option, index)         

那么,我怎样才能让sizeHint正确识别我的大胆字体的宽度?我似乎只是在这里发送纯文本。

相关问题

QLabel sizehint is too small

1 个答案:

答案 0 :(得分:1)

根据Pie_Jesu的评论,我在计算宽度之前插入option.font.setWeight(QtGui.QFont.Bold)。所以sizeHint最终如下:

def sizeHint(self, option, index):
    fontMetrics = option.fontMetrics  
    if index.column() == 0:
        text = index.model().data(index)
        document = QtGui.QTextDocument(text)
        option.font.setWeight(QtGui.QFont.Bold) #new line
        document.setDefaultFont(option.font)
        return QtCore.QSize(document.idealWidth(), fontMetrics.height())
    return QtGui.QStyledItemDelegate.sizeHint(self, option, index)    

所以,基本上,无论你使用paint函数中的文本设置什么属性,在sizeHint内匹配该宽度的一种方法是明确地构建那些相同的属性。

它可行,但似乎可疑代码重复设置两次,一次在paint中,然后再次在sizeHint中设置文本属性。应该采用更模块化的方式。也就是说,sizeHint可以直接从正在显示的项目中读取格式。

稍后添加的编辑:这几乎是这些工作的方式。在加号上,使用QTextDocument,您只需设置一个文档,而不是将其附加到QTextEdit进行显示,因此实际上没有太多开销。