2010-07-19 76 views
3

我想使用XComposite和XRender將窗口的內容渲染到QWidget(或QPixmap)中。 我面臨的問題是我無法將圖片呈現在QWidget中。以下代碼使用以下教程編寫:http://ktown.kde.org/~fredrik/composite_howto.html 窗口ID是硬編碼的,因此可以使用任何其他窗口ID。打開的QWidget窗口不顯示原始窗口的內容,只是顯示空白的灰色矩形。同樣的事情是,如果我使用QPixmap,它只包含黑色矩形,沒有別的。 已啓用XRender支持。Qt + XCompositeRender問題

我在這裏錯過了什麼?

int main(int argc, char *argv[]) 
{ 

    QApplication app(argc, argv); 

    Display *dpy = XOpenDisplay(getenv("DISPLAY")); 

    Window window = 2097154; 

    XCompositeRedirectWindow(dpy, window, CompositeRedirectManual); 

    XWindowAttributes attr; 

    XGetWindowAttributes(dpy, window, &attr); 

    XRenderPictFormat *format = XRenderFindVisualFormat(dpy, attr.visual); 
    bool hasAlpha    = (format->type == PictTypeDirect && format->direct.alphaMask); 
    int x      = attr.x; 
    int y      = attr.y; 
    int width     = attr.width; 
    int height    = attr.height; 

    qDebug() << hasAlpha << x << y << width << height; 

    XRenderPictureAttributes pa; 
    pa.subwindow_mode = IncludeInferiors; // Don't clip child widgets 


    QWidget widget; 
    widget.setGeometry(100, 100, 500, 500); 
    widget.show(); 
    Picture picture = XRenderCreatePicture(dpy, window, format, CPSubwindowMode, &pa); 

    XRenderComposite(dpy, PictOpSrc, picture, None, 
         widget.x11PictureHandle(), 0, 0, 0, 0, 0, 0, 500, 500); 

    XRenderFreePicture(dpy, picture); 

    return app.exec(); 
} 

回答

0

看起來你需要使用

app.setGraphicsSystem("native"); 

,而不是默認raster圖形系統具有QPixmap緩衝存儲。