Qt QGraphicsProxyWidget模糊/相交时弹出QComboBox

Qt QGraphicsProxyWidget模糊/相交时弹出QComboBox,qt,proxy,qgraphicsview,qcombobox,Qt,Proxy,Qgraphicsview,Qcombobox,我有一个QGraphicscene,其中显示一些QGraphicsProxyWidget,例如QComboBox。在初始状态下,一切正常: 但是,一旦显示组合框的弹出部分,它就不在场景顶部,而是在组合框南部后面的元素后面: 每当组合框悬停时,我已经给代理一个高Z级别的值,但这没有帮助 bool MyClass::sceneEventFilter(QGraphicsItem* pWatchedObj, QEvent* pEvent) { if(pEvent->type() ==

我有一个QGraphicscene,其中显示一些QGraphicsProxyWidget,例如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级别进行适当的重新排序/排序

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值仅在同级元素之间计数


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

QComboBox和QLineEdit的屏幕截图中所示的小部件代理是不同QGraphicsItem的父对象(在我的例子中,一个QLabel和一个输入小部件总是被分组到一个QGraphicsItem)

我假设我设置的z值将具有全局效果=最高值将是整个场景中的顶部对象,而与层次无关。但事实并非如此。通过为QComboBox设置高z值,我只确保它将绘制在同级QLabel之上


然而,正确的方法是(在我的场景中)增加QLabel和QComboBox作为父对象的QGraphicsItem的z值。这样,它的子项也“更高”,因此可以透支下一个QLabel和QLineEdit(因为它们现在属于一个“更低”的不同QGraphicsItem)。

尝试在通过scene->addWidget()创建代理小部件后立即为其设置值。假设“设置Z顺序”始终能够提升窗口可能不正确。您需要提供更多信息,说明此问题涉及的所有项目的父子关系。
zValue
仅对直接同级有影响所有其他的
QGraphicItem
都是按子-父关系排序的(以及一些允许将子项拖到父项后面的标志)。不幸的是,它不起作用。下拉框仍被遮挡。也许,我需要一种方法在下拉选择框本身而不是在输入/显示字段上调用raise()。您以前添加过addWidget()方法吗,因为widget()从addWidget()返回嵌入的widget。是的。整个场景是在sceneEventFilter()激活之前构建的。否则,检索小部件将返回空指针,对raise()的调用将导致异常。raise()和setZValue()方法都不起作用,我认为问题出在其他地方,而不在上述函数中。可能是,尽管我还不知道这可能在哪里。我将尝试创建一个只有场景、矩形形状和下拉列表的最小示例。也许这就缩小了范围。