2013-04-25 87 views
1

我有一個相當不真實的情況 - 我有一個帶有子部件的小部件,我需要父母完成的繪畫,繞過Qt 5繪製系統。詳細:存在具有OpenGL上下文一個QWidget和它其畫在正常的paintEvent():由他們的父母繪製QWidgets

mRenderer->activate(); 
    mRenderer->preRender(); 
    mRenderer->setClearColor(Color(0.75f)); 
    mRenderer->clear(Renderer::CLEAR_Color); 

    QList<RendererWidgetWrapper *> wrappers = findChildren<RendererWidgetWrapper *>(); 
    foreach (RendererWidgetWrapper *wrapper, wrappers) 
     wrapper->paint(); 

    mRenderer->postRender(); 

其中mRenderer爲OpenGL中的包裝物(或任何其他可能的3D渲染器)。請注意,它在其子節點上顯式調用paint()。這個paint()函數只是使用mRenderer渲染一些東西,因此繞過了普通的Qt paint pipeline。父窗口小部件設置了一些屬性:

setAttribute(Qt::WA_PaintOnScreen); 
    setAttribute(Qt::WA_NoSystemBackground); 
    setAttribute(Qt::WA_OpaquePaintEvent); 
    setAttribute(Qt::WA_PaintUnclipped); 

並返回nullptr作爲其QPaintEngine。孩子們也返回nullptr作爲QPaintEngine,但不要設置除Qt :: WA_NoSystemBackground和Qt :: WA_OpaquePaintEvent之外的任何其他屬性。簡而言之 - 整個事情就是讓數百個小部件渲染到其父級所擁有的一個OpenGL上下文中,以避免使用許多上下文來殺死系統。 這種方法的問題是孩子們都是黑人。有些東西正在清理它們的可見區域,我不知道如何使這種黑暗消失。有誰知道如何處理它?

編輯:

使用setUpdatesEnabled(假);刪除黑色背景,但現在子部件的區域未更新。而是包含之前在屏幕上可見的內容。

編輯2:

我發現的Qt創建本地兒童的窗戶,如果家長有Qt的:: WA_PaintOnScreen屬性,這會導致問題。所以現在的問題是如何避免它,同時迫使父母成爲本地窗口?

回答

0

如果你想繞過油漆事件爲您的孩子,您可以重新實現

virtual void paintEvent (QPaintEvent * event); 

他們。這樣的:

.H

class QWidgetNoPaintEvent : public QWidget 
{ 
    //reimplement all ctors here 
    virtual void paintEvent (QPaintEvent * event); 
} 

的.cpp

void QWidgetNoPaintEvent::paintEvent (QPaintEvent * event) 
{ 
//do nothing, or reject event, or do something custom ??? 
} 

我不是100%肯定這是否會解決,雖然其他的問題,因爲它只會通過Qt的阻擋油漆事件從QWidgetNoPaintEvent繼承的小部件。

+0

這並不能解決問題,因爲QWidget :: paintEvent()已經不做任何事情。 – krojew 2013-04-25 20:32:25