QWidget::repaint()被“跳过”;粘贴的“;标志Qt::WA_UpdatesDisabled
因此,情况如下:QWidget::repaint()被“跳过”;粘贴的“;标志Qt::WA_UpdatesDisabled,qt,qwidget,paintevent,Qt,Qwidget,Paintevent,因此,情况如下: Qt 4.8.4,MSVS 2012 我有六个QToolButton在QWidget里面(这个QWidget在另一个QWidget里面),QToolButton位于QHBoxLayout中 当我在QToolButton之一上快速按下鼠标左键时,将鼠标移出QToolButton,并在顶部父QWidget上释放鼠标按钮5次或更多次。在某些情况下,QToolButton看起来正常,但在其他状态下(悬停、按下)不会重新绘制 搜索QTBUG-无结果 QToolButton仍会发出单击、按
Qt 4.8.4
,MSVS 2012
我有六个QToolButton
在QWidget
里面(这个QWidget
在另一个QWidget
里面),QToolButton
位于QHBoxLayout
中
当我在QToolButton
之一上快速按下鼠标左键时,将鼠标移出QToolButton
,并在顶部父QWidget
上释放鼠标按钮5次或更多次。在某些情况下,QToolButton
看起来正常,但在其他状态下(悬停、按下)不会重新绘制
搜索QTBUG
-无结果
QToolButton
仍会发出单击、按下、释放和其他信号,但不会重新绘制。
在Qt
源代码和调试中的一些搜索提供了一些信息:
我继承QToolButton
,reimlement enterEvent
,leaveEvent
,mousePressEvent
,mouseereleaseevent
,paintEvent
输入事件
,离开事件
,鼠标压力事件
,鼠标释放事件
-仍在工作。
paintEvent
-已忽略
在输入事件
,离开事件
,鼠标压力事件
,鼠标事件
中添加更新或重新绘制:无效
然后我使用break pintsm,发现:在QWidget::repaint(const QRect&rect)
中检查标志,并且updatesEnabled()
为return false,然后调用return from repaint!!!好的,进入updateEnabled()
这意味着Qt::WA_updates disabled
设置为true
Qt助理:
Qt::WA_updates disabled
表示更新被阻止(包括系统后台)。此标志由Qt内核设置或清除
嗯。。。
我们有另一个标志,我们可以更改:
指示显式禁用小部件的更新;i、 e.即使其所有祖先都设置为已启用更新状态,它仍将保持禁用状态。这意味着WA_updates disabled
。这是由QWidget::setUpdatesEnabled()
设置/清除的
内部setUpdatesEnabled()
属性Qt::WA_UpdatesDisabled
正在更改
使用QWidget::setUpdatesEnabled()
仍然无效
我知道,对于QToolButton
,这个用例并不常见,我也不尝试拖放。我指的是简单的顺序:mousePress
-mouseMove
-mouseerelease
有什么建议吗?您需要使用Qt测试框架为此准备一个自包含的测试用例,这样就不必在任何地方单击,并将其作为Qt bug提交—假设您成功地再现了这个问题。
inline bool QWidget::updatesEnabled() const
{ return !testAttribute(Qt::WA_UpdatesDisabled); }