QComboBox的弹出窗口,因为QGraphicsProxyWidget被遮挡/交叉

时间:2016-02-02 08:59:48

标签: qt proxy qgraphicsview qcombobox

我有一个 QGraphicsScene ,其中我正在显示一些 QGraphicsProxyWidgets ,例如 QComboBox 。在最初的状态,一切都很好:

Initial State

然而,一旦显示组合框的弹出部分,它不在场景的顶部,而是在组合框的南边的元素后面:

Popup State

每当组合框悬停时,我已经给代理提供了高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级别进行正确的重新排序/排序?

2 个答案:

答案 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 )。