所以,情况:
Qt 4.8.4
,MSVS 2012
。
我QToolButton
内有QWidget
个QWidget
位于另一个QWidget
内,QToolButtons
位于QHBoxLayout
。
当我在QToolButton
之一上快速按下鼠标左键时,将鼠标移出QToolButton
并在顶级父QWidget
上释放鼠标按钮5次或更多次。有些概率QToolButton
看起来很正常,但在其他状态(悬停,按下)它没有重新绘制。
搜索QTBUG
- 没有结果。
QToolButton
仍会发出点击,按下,释放和其他信号,但不会重新绘制。
一些在Qt
源代码中搜索和调试会提供一些信息:
我继承了QToolButton
,reimlement enterEvent
,leaveEvent
,mousePressEvent
,mouseReleaseEvent
,paintEvent
。
enterEvent
,leaveEvent
,mousePressEvent
,mouseReleaseEvent
- 仍然有效。
paintEvent
- 被忽略。
在enterEvent
,leaveEvent
,mousePressEvent
,mouseReleaseEvent
中添加更新或重新显示:无效。
然后我使用break pintsm,并找到:在QWidget::repaint(const QRect &rect)
中检查标志,updatesEnabled()
返回false然后从重新调用返回!!! O_O好的,进入updatesEnabled()
。
inline bool QWidget::updatesEnabled() const
{ return !testAttribute(Qt::WA_UpdatesDisabled); }
这意味着Qt::WA_UpdatesDisabled
设置为真。
Qt助理:
Qt::WA_UpdatesDisabled
表示更新被阻止(包括系统背景)。该标志由Qt内核设置或清除。
... Hmmmmm
我们还有另一个标志 Qt::WA_ForceUpdatesDisabled
,我们可以更改:
表示为窗口小部件显式禁用了更新;即使所有祖先都设置为启用更新状态,它仍将保持禁用状态。这意味着WA_UpdatesDisabled
。这由QWidget::setUpdatesEnabled()
设置/清除。
内部setUpdatesEnabled()
属性Qt::WA_UpdatesDisabled
正在改变
使用QWidget::setUpdatesEnabled()
仍无效。
我知道,这个用例不适用于QToolButton
,我不会尝试拖放。我的意思是简单的序列:mousePress
- mouseMove
- mouseRelease
。
有什么建议吗?