如何利用QStyledItemDelegate在QTreeWidget中设置不同高度的QTreeWidgetItems?

问题描述

注意:事实证明,问题并非归因于QStyledItemDelegate的实现,而是事实是,在MyTreeWidget的构造函数中,我正在调用setUniformRowHeights(true) 。以下代码和@scopchanov发布的解决方案有效且有效

QTreeWidget有一个受保护的方法,称为itemFromIndex(),这就是我使之可访问的方法:

class MyTreeWidget : public QTreeWidget {
    Q_OBJECT
public:
    MyTreeWidget(QWidget *parent) : QTreeWidget(parent) {
        setItemDelegate(new MyItemDelegate(this));
    }

    QTreeWidgetItem treeWidgetItemFromIndex(const QModelIndex& index) {
        return itemFromIndex(index);
    }
}

在我的QStyledItemDelegate中,我存储了一个指向MyTreeWidget的指针,然后基于sizeHint()的类型添加了填充,覆盖了它的虚拟QTreeWidgetItem方法。 / p>

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

这是行不通的,因为不会sizeHint()的每个代表都被调用QTreeWidgetItem

因此,我在setSizeHint()的构造函数中调用MyCustomTreeWidgetItem1的文本选项似乎也没有任何作用。 Qt是否因为有委托而忽略了它?

另一种选择是设置QWidget中包含的MyCustomTreeWidgetItem的最小高度,这可以通过QTreeWidget::setItemWidget()来实现。

所以看起来就像我使用委托的那一刻,我只限于大小。我可以选择摆脱代表,还是可以尝试其他方法?

我知道很多人会说从QTreeWidget切换到QTreeView,但目前尚不可能。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)