QWidget :: repaint()跳过"坚持" flag Qt :: WA_UpdatesDisabled

时间:2014-02-12 16:21:49

标签: qt qwidget paintevent

所以,情况:

Qt 4.8.4MSVS 2012

QToolButton内有QWidgetQWidget位于另一个QWidget内,QToolButtons位于QHBoxLayout

当我在QToolButton之一上快速按下鼠标左键时,将鼠标移出QToolButton并在顶级父QWidget上释放鼠标按钮5次或更多次。有些概率QToolButton看起来很正常,但在其他状态(悬停,按下)它没有重新绘制。

搜索QTBUG - 没有结果。

QToolButton仍会发出点击,按下,释放和其他信号,但不会重新绘制。 一些在Qt源代码中搜索和调试会提供一些信息:

我继承了QToolButtonreimlement enterEventleaveEventmousePressEventmouseReleaseEventpaintEvent

enterEventleaveEventmousePressEventmouseReleaseEvent - 仍然有效。 paintEvent - 被忽略。

enterEventleaveEventmousePressEventmouseReleaseEvent中添加更新或重新显示:无效。

然后我使用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

有什么建议吗?

0 个答案:

没有答案