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 仅在兄弟元素之间计数。
我最终找到了问题及其解决方案:
QComboBox 和 QLineEdit 的屏幕截图中显示的小部件代理是不同 QGraphicsItems[ 的父级=35=](在我的例子中,一个 QLabel 和一个输入小部件总是组合到一个 QGraphicsItem)。
我假设我设置的 z-values 将具有全局效果 = 最高值将是整个场景中的顶部 object,与层次结构无关。然而事实并非如此。通过为 QComboBox 设置高 z-value 我只确保它会被绘制在兄弟 QLabel.
之上
然而,正确的方法是(在我的场景中)增加 QGraphicsItem 的 z-value 而 QLabel 和QComboBox 是父级。这样它的 children 也是 "higher" 所以可以透支下一个 QLabel 和 QLineEdit (因为属于现在 "lower" 不同 QGraphicsItem).
我有一个 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 仅在兄弟元素之间计数。
我最终找到了问题及其解决方案:
QComboBox 和 QLineEdit 的屏幕截图中显示的小部件代理是不同 QGraphicsItems[ 的父级=35=](在我的例子中,一个 QLabel 和一个输入小部件总是组合到一个 QGraphicsItem)。
我假设我设置的 z-values 将具有全局效果 = 最高值将是整个场景中的顶部 object,与层次结构无关。然而事实并非如此。通过为 QComboBox 设置高 z-value 我只确保它会被绘制在兄弟 QLabel.
之上然而,正确的方法是(在我的场景中)增加 QGraphicsItem 的 z-value 而 QLabel 和QComboBox 是父级。这样它的 children 也是 "higher" 所以可以透支下一个 QLabel 和 QLineEdit (因为属于现在 "lower" 不同 QGraphicsItem).