2016-07-25 36 views
0

QTreeViewには複数の列(表など)があります。ツリー内の列は固定サイズです。行の高さを変更し、QTableView::resizeRowsToContentsのような複数行のテキストを使用する必要があります。 どうすればいいですか?QTreeView:resizeRowsToContentsと同等または行内にテキストを折り返す方法

QStyledItemDelegateを再実装して試してみましたが、sizeHintの既知の幅で複数行のテキストブロックの高さを計算する方法がわかりません。

答えて

1

QStyledItemDelegateを使用するのが適切な方法です。あなたのsizehinz機能では、あなたがQFontMetricsクラスにtextスタイルオプションを使用することができます。

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; 
} 

注:今、私はこれをテストすることはできませんが、それが動作するはずです。
sizeHintのみ初期レイアウトを作成するために一度呼び出されますようだが、いない列のサイズを変更した後:あなたは出力が

EDITニーズに適合しない場合metrics.boundingRectへの呼び出しを微調整する必要があります。

Qt::SizeHintRoleを使用して希望のサイズに戻すには、QAbstractItemModel::data関数をオーバーライドすることが最終的に考えられます。あなたは既存のモデルに追加するか、これを行うには、プロキシ・モデルを提供することができ、次のいずれか

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

OK!しかし、サイズ変更された細胞で再び細胞をサイズ変更する方法はありますか? – Rinat

+0

私はあなたが何を意味しているshureではないのですか?ヘッダーセクションのサイズを変更しますか? – Felix

+0

はい、ロード時に1行リサイズされますが、ヘッダーセクションとカラム幅のサイズ変更時には何も実行されません – Rinat

関連する問題