Можно и просто через QPixmap::grabWindow (работает и для окон с OpenGL). Ну а дальше-то что? Напр нужно провести хоr-линию, не буду же я выцарапывать и инвертировать по пикселю

Остается скопировать все содержимое в верхнее, ну как бы покрыть окно его же копией и там уже xor-ить. Но тогда придется следить за изменением нижнего - не кайф
Почему обязательно через XOR и QRubberBand?
Разве свой rubber-band сложно сделать? Например, типа затемнённой заливки?
При изменениях области через QPixmap::grabWindow() захватываешь соответствующую область с основного окна, заливаешь полученный пиксмап через drawRect() полупрозрачным QBrush и непрозрачным QPen и уже этот пиксмап отрисовываешь на верхнем окне.
Насчёт слежения за изменениями нижнего...
А нужно ли?
Ведь показывать верхнее окно следует только по нажатию кнопкой мыши.
Думаю ничего страшного не произойдёт, если картинка замрёт.
Не вижу проблемы)
Кстати, судя по описанию QPixmap::grabWindow():
The grabWindow() function grabs pixels from the screen, not from the window, i.e. if there is another window partially or entirely over the one you grab, you get pixels from the overlying window, too. The mouse cursor is generally not grabbed.
использовать его в данном случае не получится.
У себя я добирался непосредственно до double-buffer так:
C++ (Qt)
#include <private/qwindowsurface_p.h>
if( QPaintDevice* pdev = top_level->windowSurface()->paintDevice() )
{
if( QPixmap* pix = dynamic_cast< QPixmap* >( pdev ) )
{
...
}
else if( QImage* img = dynamic_cast< QImage* >( pdev ) )
{
...
}
}