QComboBox 的弹出窗口作为 QGraphicsProxyWidget 被遮挡/相交

Popup of QComboBox as QGraphicsProxyWidget obscured / intersected

我有一个 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;
        }
    }
}

有人有想法吗?我是否必须以某种方式拦截鼠标按下事件并重新计算组合框大小(加上它的弹出窗口)以通知 scene/view 在 Z 级别方面的适当 re-ordering/sorting?

QWidget 具有用于将小部件提升到父小部件堆栈顶部的 raise() 方法。

通过widget()方法获取QGraphicsProxyWidget的widget,然后使用raise()方法。

函数为:

bool MyClass::sceneEventFilter(QGraphicsItem* pWatchedObj, QEvent* pEvent)
{
    if(pEvent->type() == QEvent::GraphicsSceneHoverEnter)
    {
        if(pWatchedObj == m_pProxy)
        {
            m_pProxy->widget()->raise();
            return false;
        }
    }
}

试试上面的改变。效果应该不错。

TL;DR: z-values 仅在兄弟元素之间计数。


我最终找到了问题及其解决方案:

QComboBoxQLineEdit 的屏幕截图中显示的小部件代理是不同 QGraphicsItems[ 的父级=35=](在我的例子中,一个 QLabel 和一个输入小部件总是组合到一个 QGraphicsItem)。

我假设我设置的 z-values 将具有全局效果 = 最高值将是整个场景中的顶部 object,与层次结构无关。然而事实并非如此。通过为 QComboBox 设置高 z-value 我只确保它会被绘制在兄弟 QLabel.

之上

然而,正确的方法是(在我的场景中)增加 QGraphicsItem 的 z-value 而 QLabelQComboBox 是父级。这样它的 children 也是 "higher" 所以可以透支下一个 QLabelQLineEdit (因为属于现在 "lower" 不同 QGraphicsItem).