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
は、指定された列の現在の幅を返すために実装する必要があります。
OK!しかし、サイズ変更された細胞で再び細胞をサイズ変更する方法はありますか? – Rinat
私はあなたが何を意味しているshureではないのですか?ヘッダーセクションのサイズを変更しますか? – Felix
はい、ロード時に1行リサイズされますが、ヘッダーセクションとカラム幅のサイズ変更時には何も実行されません – Rinat