Qt QGraphicsProxyWidget模糊/相交时弹出QComboBox
我有一个QGraphicscene,其中显示一些QGraphicsProxyWidget,例如QComboBox。在初始状态下,一切正常: 但是,一旦显示组合框的弹出部分,它就不在场景顶部,而是在组合框南部后面的元素后面: 每当组合框悬停时,我已经给代理一个高Z级别的值,但这没有帮助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() ==
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()方法都不起作用,我认为问题出在其他地方,而不在上述函数中。可能是,尽管我还不知道这可能在哪里。我将尝试创建一个只有场景、矩形形状和下拉列表的最小示例。也许这就缩小了范围。