短版
运行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
正确识别我的大胆字体的宽度?我似乎只是在这里发送纯文本。
相关问题
答案 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
进行显示,因此实际上没有太多开销。