Оригинал : я использую метод sizeHint () базового класса, чтобы получить размер ячейки таким, каким он был бы, затем изменяю QSize по мере необходимости, например:
QSize MyDelegate::sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const
{
QSize sz=QItemDelegate::sizeHint(option, index);
int h=sz.height();
< MODIFY h HERE >
sz.setHeight(h);
return sz;
}
Кажется, работает нормально.
Редактировать : плакат указывает, что это не работает для него ... Так что вот еще один вариант, возможно, не самый элегантный: добавить члена представления к делегату (о котором я не могу думать способ получить от делегата) и использовать модельный индекс, чтобы получить размер раздела заголовка. Например:
class MyDelegate : public QItemDelegate
{
public:
<the usual, then add>
void setView(QAbstractItemView* v) { theView=v; }
protected:
QAbstractItemView* theView;
};
и в реализации
QSize MyDelegate::sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const
{
int theWidth=-1;
// handle other types of view here if needed
QTreeView* tree=qobject_cast<QTreeView*>(theView);
if(tree)
{
qDebug("WIDTH @ %d : %d",index.column(),tree->header()->sectionSize(index.column()));
theWidth=tree->header()->sectionSize(index.column());
}
QSize sz=QItemDelegate::sizeHint(option, index);
if(theWidth>=0)
sz.setWidth(theWidth);
// compute height here and call sz.setHeight()
return sz;
}
Осталось только сделать в вашем коде, после создания делегата, вызвать setView ():
MyDelegate* theDelegate=new MyDelegate(...);
theDelegate->setView(theView);