Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
QWidget::repaint()被“跳过”;粘贴的“;标志Qt::WA_UpdatesDisabled_Qt_Qwidget_Paintevent - Fatal编程技术网

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); }