【问题标题】:Popup of QComboBox as QGraphicsProxyWidget obscured / intersectedQComboBox 弹出为 QGraphicsProxyWidget 被遮挡/相交
【发布时间】:2016-02-02 08:59:48
【问题描述】:

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

有人有想法吗?我是否必须以某种方式拦截鼠标按下事件并重新计算组合框大小(加上其弹出窗口)以通知场景/视图以根据 Z 级别进行正确的重新排序/排序?

【问题讨论】:

  • 在scene->addWidget()创建代理小部件后立即尝试对其进行setZValue。假设设置 Z-order 总是能够提升窗口可能是不正确的。
  • 您需要提供更多信息,该问题涉及的所有项目的父子关系是什么。 zValue 仅对直接兄弟姐妹有影响,所有其他 QGraphicItem 都按子父关系排序(以及一些允许在父级后面绘制子级的标志)。

标签: qt proxy qgraphicsview qcombobox


【解决方案1】:

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;
        }
    }
}

尝试上述更改。效果应该不错。

【讨论】:

  • 不幸的是,不起作用。下拉框仍然被遮挡。也许,我需要一种在下拉选择框本身而不是在输入/显示字段上调用 ​​raise() 的方法。
  • 您之前是否添加了 addWidget() 方法,因为 widget() 从 addWidget() 返回嵌入的小部件。
  • 是的。整个场景是在 sceneEventFilter() 激活之前构建的。否则,检索小部件将返回一个空指针,并且对 raise() 的调用将导致异常。
  • raise() 和 setZValue() 方法都不起作用,我认为问题出在其他地方,而不是在上述函数中。
  • 可能是,虽然我还不知道这可能在哪里。我将尝试创建一个只有场景、矩形和下拉菜单的最小示例。也许这会缩小范围。
【解决方案2】:

TL;DR: z 值仅计算在兄弟元素之间。


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

QComboBoxQLineEdit 的屏幕截图中显示的小部件代理是不同 QGraphicsItems 的父级(在我的情况下是一个 QLabel 和一个输入小部件总是组合到一个 QGraphicsItem)。

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

然而,正确的方法是(在我的场景中)增加 QLabelQComboBox 所在的 QGraphicsItem 的 z 值父母。这样它的孩子也“更高”,因此可以过度绘制下一个 QLabelQLineEdit(因为它们属于现在“更低”的不同 QGraphicsItem)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-07
    • 1970-01-01
    相关资源
    最近更新 更多