我有一個相當不真實的情況 - 我有一個帶有子部件的小部件,我需要父母完成的繪畫,繞過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屬性,這會導致問題。所以現在的問題是如何避免它,同時迫使父母成爲本地窗口?
這並不能解決問題,因爲QWidget :: paintEvent()已經不做任何事情。 – krojew 2013-04-25 20:32:25