1

所以,情况:

Qt 4.8.4, MSVS 2012.

我有六个QToolButton里面QWidget(这QWidget是另一个里面QWidget),QToolButtons位于QHBoxLayout

当我在其中一个上快速按下鼠标左键时QToolButton,然后将鼠标移出QToolButton并释放顶部父级上的鼠标按钮QWidget5 次或更多次。有一些概率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

有什么建议?

4

0 回答 0