问题描述
注意:事实证明,问题并非归因于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 (将#修改为@)