qtpropertybrowser是Qt属性树控件,当我们自定义编辑控件时,如何让我们的控件能够不被压缩为item大小,从而能够正常显示呢?
错误演示:
正确效果
解决方案
qtpropertybrowser,其核心控件用的是QTreeWidget,因此可以修改其用到的委托:QtPropertyEditorDelegate类,要求使用minimumHeight()而非height(),这是因为Qt内置控件默认高度大于QTreeWidgetItem高度,例如QSpinBox的高度就比QTreeWidgetItem的高度要高,这会导致QSpinBox控件也向弹出窗口一样超过QTreeWidgetItem几何范围。
void QtPropertyEditorDelegate::updateEditorGeometry(QWidget *editor,
const QStyleOptionViewItem &option, const QModelIndex &index) const
{
Q_UNUSED(index)
editor->setGeometry(option.rect.adjusted(0, 0, 0, editor->minimumHeight() > option.rect.height() ? editor->height() - option.rect.height() : -1));
}
注:因为要求使用minimumHeight()
,Qt内置控件默认minimumHeight()
为0,而我们自定义弹出窗口的高度一般要大于QTreeWidgetItem
高度,所以我们要设置弹出窗体的最小高度setMinimumHeight()
;(最小高度即最合适的高度,即sizeHint
大小)
疑惑:我们重写minimumHeight()
函数,返回一个最小高度可以吗(最小高度即最合适的高度,即sizeHint
大小)
解惑:不可以,由于minimumHeight()
并非虚函数,而updateEditorGeometry
处用的基类QWidget*
类型的editor
指针,
editor->minimumHeight()
调用的是基类的值,无法调用我们重写minimumHeight()
函数返回的值。
疑惑:既然是最合适的高度,那么我们为什么不一开始就用sizeHint()
中的高度呢?重写sizeHint()
不好吗?
解惑:因为我们无法区分控件(弹窗控件)是Qt内置控件还是我们自定义控件,内置控件sizeHint()
高度也大于QTreeWidgetItem
高度,那岂不是都变高了。。。