所以,情况:
Qt 4.8.4
, MSVS 2012
.
我有六个QToolButton
里面QWidget
(这QWidget
是另一个里面QWidget
),QToolButtons
位于QHBoxLayout
。
当我在其中一个上快速按下鼠标左键时QToolButton
,然后将鼠标移出QToolButton
并释放顶部父级上的鼠标按钮QWidget
5 次或更多次。有一些概率QToolButton
看起来很正常,但在其他状态下(悬停,按下)它不会重新粉刷。
搜索QTBUG
- 没有结果。
QToolButton
仍然发出 clicked、pressed、release 和 else 信号,但不会重新绘制。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,然后调用return from repaint !!! O_O好的,进去吧updatesEnabled()
。
inline bool QWidget::updatesEnabled() const
{ return !testAttribute(Qt::WA_UpdatesDisabled); }
这意味着Qt::WA_UpdatesDisabled
设置为真。
Qt Assistant :
表示更新被阻止(包括系统后台)。该标志由 Qt 内核设置或清除。Qt::WA_UpdatesDisabled
嗯......我们有另一个标志Qt::WA_ForceUpdatesDisabled
,我们可以改变它:
表示对小部件显式禁用更新;即,即使它的所有祖先都设置为启用更新状态,它也将保持禁用状态。这意味着WA_UpdatesDisabled
。这是由 设置/清除的QWidget::setUpdatesEnabled()
。
内部setUpdatesEnabled()
属性Qt::WA_UpdatesDisabled
正在改变
使用QWidget::setUpdatesEnabled()
仍然没有效果。
我知道,这个用例不常见QToolButton
,我不尝试拖放。我的意思是简单的序列:mousePress
- mouseMove
- mouseRelease
。
有什么建议?