Qt:绘画事件和父子关系



如果我有paprent小部件A,那么我有一个A的子小部件B。

如果我触发了 A 的 paint 事件,B 的 paint 事件会被触发吗?如果我触发了 B 的 paint 事件,A 的 paint 事件会被触发吗?

如果它依赖于其他一些属性,则属性是什么?透明度?是否有一般规则,以便我可以知道将触发哪个 Widget 的绘制事件?

我认为最有用的答案是你应该写你的paintEvent方法而不关心。因为实际答案将取决于您正在运行的平台,并且正如您猜测的那样,透明度也可能发挥作用,但小部件是否由本机支持也可能很重要。

Qt5 始终对所有小部件使用双缓冲绘图,但未指定缓冲实际发生的粒度(窗口、所有小部件、仅本机支持的小部件)。如果两个小部件都是不透明的,我猜只有您失效的小部件会被重新绘制,因为另一个将保留在后备存储中。但是,如果使 A 无效导致 B 的重绘,我也不会完全感到惊讶。

由于有很多事情是您无法

控制的,可能会导致绘制事件,因此最简单的答案是确保您的绘画代码不在乎,并相信双缓冲机制仅在需要时才调用您的代码。(假设你没有给自己打电话太多update()

如果你依赖于什么情况可以调用paintEvent,那么你就做错了。如果小部件可见,则paintEvent必须始终可调用。您必须期望它随时被调用,无论系统的其余部分发生什么情况。

理想情况下,paintEvent的实现不应修改对象的状态。我发现将实现转发给const助手以使其显而易见很有帮助:

class MyWidget : public QWidget {
  void paintEvent(QPaintEvent * event) Q_DECL_OVERRIDE {
    QPainter painter(this);
    paintEventImpl(event, painter);
  }
  void paintEventImpl(QPaintEvent *, QPainter &) const;
  ...
};

最新更新