2016-07-25 35 views

回答

1

使用QStyledItemDelegate是正确的方法。在你sizehinz功能,您可以使用样式选项textQFontMetrics类:

QSize MyItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override { 
    QSize baseSize = this->QStyledItemDelegate::sizeHint(option, index); 
    baseSize.setHeight(10000);//something very high, or the maximum height of your text block 

    QFontMetrics metrics(option.font); 
    QRect outRect = metrics.boundingRect(QRect(QPoint(0, 0), baseSize), Qt::AlignLeft, option.text); 
    baseSize.setHeight(outRect.height()); 
    return baseSize; 
} 

注:现在我不能对此进行测试,但它应该工作。您可能需要调整调用metrics.boundingRect如果输出不适合您的需求

编辑:
看来sizeHint将只调用一次以创建初始布局,但不调整列后。

最后的想法可能是覆盖QAbstractItemModel::data函数以使用Qt::SizeHintRole返回所需的大小。你既可以把它添加到您现有的模型或提供代理模型要做到这一点:

QSize MyModel::data(const QModelIndex &index, int role) const override { 
    switch(role) { 
     //... 
    case Qt::SizeHintRole: 
    { 
     QSize baseSize(getFixedWidth(index.column()), baseSize.setHeight(10000));//something very high, or the maximum height of your text block 

     QFontMetrics metrics(this->data(index, Qt::FontRole).value<QFont>()); 
     QRect outRect = metrics.boundingRect(QRect(QPoint(0, 0), baseSize), Qt::AlignLeft, this->data(index, Qt::DisplayRole))); 
     baseSize.setHeight(outRect.height()); 
     return baseSize; 
    } 
     //... 
    } 
} 

重要提示:每当你视图获取大小,你将不得不发出dataChanged信号对所有这些项目。 getFixedWidth是你必须实现的东西,以返回给定列的当前宽度。

+0

好的,它的工作原理!但是如何让细胞再次调整大小? – Rinat

+0

我不确定你的意思?调整标题部分的大小? – Felix

+0

是的,行在加载时调整大小,但在更改标题部分和列宽度时更改大小 – Rinat

相关问题