2016-03-01 80 views
0

如果我有一个paprent控件A,那么我有一个A的子控件B. B嵌入在A.Qt:Paintevent和亲子关系?

如果我触发A的paintEvent,B的paint事件是否会被触发? 如果我触发B的paintEvent,A的绘画事件是否会被触发?

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

回答

2

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

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

由于有太多无法控制的东西会导致绘画事件,所以最简单的答案就是确保绘画代码不关心,并且相信双缓冲机制只在需要时调用您的代码太。 (假设你自己不打电话update()太多)

1

如果您要取决于paintEvent可以在什么情况下被调用,那么您做错了。 A 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; 
    ... 
}; 
+0

我的paintEvent总是调用,问题是,这是一个有点贵(吸引了许多图像)。所以我想减少它被调用的次数。 – Nyaruko

+1

@Nyaruko图像绘制不应该很昂贵,如果你的图像没有缩放,它是一个条纹内存副本。如果您缩放图像,它将有助于缓存它们。它应该非常快,如果不是,你的'paintEvent'不知何故被破坏。你的问题是经典的X-Y。你担心什么时候调用paintEvent,但是你应该问如何让它更快! –