我有一个 QGraphicsScene ,其中我正在显示一些 QGraphicsProxyWidgets ,例如 QComboBox 。在最初的状态,一切都很好:
然而,一旦显示组合框的弹出部分,它不在场景的顶部,而是在组合框的南边的元素后面:
每当组合框悬停时,我已经给代理提供了高Z值,但这并没有帮助。
bool MyClass::sceneEventFilter(QGraphicsItem* pWatchedObj, QEvent* pEvent)
{
if(pEvent->type() == QEvent::GraphicsSceneHoverEnter)
{
if(pWatchedObj == m_pProxy)
{
m_pProxy->setZValue(zValue() + 200);
return false;
}
}
}
有没有人有想法?我是否必须以某种方式拦截鼠标按下事件并重新计算comboxo大小(加上其弹出窗口)以通知场景/视图以便根据Z级别进行正确的重新排序/排序?
答案 0 :(得分:0)
QWidget有raise()方法,用于将窗口小部件提升到父窗口小部件堆栈的顶部。
使用widget()方法获取QGraphicsProxyWidget的小部件,然后使用raise()方法。
功能将是:
bool MyClass::sceneEventFilter(QGraphicsItem* pWatchedObj, QEvent* pEvent)
{
if(pEvent->type() == QEvent::GraphicsSceneHoverEnter)
{
if(pWatchedObj == m_pProxy)
{
m_pProxy->widget()->raise();
return false;
}
}
}
尝试以上更改。它应该运作良好。
答案 1 :(得分:0)
TL; DR: z值仅在兄弟元素之间计算。
我最终找到了问题及其解决方案:
QComboBox 和 QLineEdit 的屏幕截图中显示的窗口小部件代理是不同的 QGraphicsItems (在我的情况下是一个QLabel和一个输入窗口小部件总是分组到一个 QGraphicsItem )。
我假设我设置的z值将具有全局效果=最高值将是整个场景中的顶级对象,而与层次结构无关。然而事实并非如此。通过为 QComboBox 设置一个高z值,我只确保它将被绘制在兄弟 QLabel 之上。
然而,正确的apporach(在我的场景中)增加 QGraphicsItem 的z值, QLabel 和 QComboBox 是父权的。这样它的孩子也“更高”,所以可以透支下一个 QLabel 和 QLineEdit (因为属于现在“较低”的不同 QGraphicsItem )。