【发布时间】:2021-02-12 10:20:24
【问题描述】:
注意:原来问题不是由于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 的类型添加一个填充。
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 调用。
所以我在MyCustomTreeWidgetItem1 的构造函数中调用setSizeHint() 的文本选项似乎也没有任何效果。 Qt 是否因为有委托而忽略它?
另一个选项是设置包含在MyCustomTreeWidgetItem 中的QWidget 的最小高度,这可以通过QTreeWidget::setItemWidget() 实现。
所以看起来在我使用委托的那一刻,我只限于大小。我可以选择摆脱委托还是可以尝试其他方法?
我知道很多人会说从QTreeWidget 切换到QTreeView,但目前不可能。
【问题讨论】:
标签: c++ qt qwidget qtreewidget qtreewidgetitem