NOTE: it turned out that the problem was not due to the implementation of QStyledItemDelegate
, but it was the fact that in the constructor of MyTreeWidget
I was calling setUniformRowHeights(true). The code below and the solution posted by @scopchanov are valid and working
QTreeWidget
has a protected method called itemFromIndex()
and this is how I am making it accessible:
class MyTreeWidget : public QTreeWidget {
Q_OBJECT
public:
MyTreeWidget(QWidget *parent) : QTreeWidget(parent) {
setItemDelegate(new MyItemDelegate(this));
}
QTreeWidgetItem treeWidgetItemFromIndex(const QModelIndex& index) {
return itemFromIndex(index);
}
}
In my QStyledItemDelegate
, I am storing a pointer to MyTreeWidget
and then overriding its virtual sizeHint()
method and based on the type of the QTreeWidgetItem
adding a padding.
class MyItemDelegate : public QStyledItemDelegate
{
Q_OBJECT
public:
MyItemDelegate(QObject *parent) : QStyledItemDelegate(parent) {
_myTreeWidget = dynamic_cast<MyTreeWidget*>(parent);
}
QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const {
auto treeWidgetItem = _myTreeWidget->treeWidgetItemFromIndex(index);
QSize padding;
if (dynamic_cast<MyCustomTreeWidgetItem1*>(treeWidgetItem) {
padding = {0, 5};
} else if (dynamic_cast<MyCustomTreeWidgetItem2*>(treeWidgetItem) {
padding = {0, 10};
}
return QStyledItemDelegate::sizeHint(option, index) + padding;
}
}
This doesn't work, since sizeHint()
of the delegate doesn't get called for every single QTreeWidgetItem
.
So my text options to call setSizeHint()
in the constructor of MyCustomTreeWidgetItem1
, and that didn't seem to have any effect either. Is Qt
ignoring it because there is a delegate?
Another option was to set a minimum height of a QWidget
that is contained in MyCustomTreeWidgetItem
which is made possible via the QTreeWidget::setItemWidget()
.
So it looks like the moment I use the delegate, I am confined to only size. Is my option to get rid of the delegate or there's something else I can try?
I know many people would say switch from a QTreeWidget
to a QTreeView
, but it's not possible at the moment.