qtpropertybrowser是Qt属性树控件,有时候自定义弹窗编辑控件高度较大,视口下方无法容纳,则考虑将弹窗向上弹出。如果上方空间也无法容纳,则考虑将弹窗居中显示,大部分情况下视口的高度应该是够用的了。如果视口的高度也不够了怎么办?别瞎想了,要么调整视口高度(即调整QtTreePropertyBrowser控件的高度),要么重新设计弹窗编辑控件吧!
注:以上说的都是在属性树QtTreePropertyBrowser控件高度不可变时产生的困扰与解决方案
效果图
1、向下弹出(默认,第一优先级)
2、向下弹出(适应,第二优先级)
3、居中弹出(适应,第三优先级)
4、全不满足,依旧默认向下弹出(建议调整视口高度/重新设计弹窗UI)
核心代码
void QtPropertyEditorDelegate::updateEditorGeometry(QWidget *editor,
const QStyleOptionViewItem &option, const QModelIndex &index) const
{
Q_UNUSED(index)
QWidget *viewPort = m_editorPrivate->treeWidget()->viewport();
QRect rect = option.rect.adjusted(0, 0, 0, editor->minimumHeight() > option.rect.height() ? editor->minimumHeight() - option.rect.height() : -1);
if (viewPort->rect().bottom() - option.rect.y() < rect.height())
{// 如果底部空间不足,尝试判断顶部空间是否满足容纳弹出窗口
if (option.rect.bottom() - viewPort->rect().top() >= rect.height())
{// 顶部空间满足容纳弹出窗口
rect.moveTop(option.rect.y() - (rect.height() - option.rect.height()));
}
else
{// 顶部空间满足容纳弹出窗口,尝试在该列位置居中显示窗口
if (viewPort->height() >= rect.height())
{// 整体空间满足容纳弹出窗口
rect.moveCenter(QPoint(option.rect.center().x(), viewPort->rect().center().y()));
}
}
}
editor->setGeometry(rect);
}