2011-11-02 82 views
0

我正在實施平鋪渲染系統(以避免GL_MAX_VIEWPORT_DIMS限制)。我需要支持QWidget -overlays,並且爲此也必須實現小部件的平鋪渲染。計劃是通過創建帶有正確轉換的QPainter並使用「轉換的」QPainter調用QWidget::render來完成此操作。使用QPainter進行平鋪渲染

我有一些testcode做到這一點:

int w = 24; 
int h = 24; 
QImage tiles[4]; 
QPushButton btn; 
btn.resize(w, h); 
btn.move(w/2, h/2); 
for (int i = 0; i < 2; ++i) { 
    for (int j = 0; j < 2; ++j) { 
    int tileidx = i + 2*j; 
    tiles[tileidx] = QImage(QSize(w, h), QImage::Format_ARGB32); 
    tiles[tileidx].fill(0); 

    QPainter painter(&tiles[tileidx]); 
    painter.setViewport(i*w,i*h, w,h); // or setWindow() 
    painter.save(); 
    painter.translate(btn.pos()); 
    btn.render(&painter); 
    painter.restore(); 
    } 
} 
for (int i = 0; i < 4; ++i) { 
    tiles[i].save(QString("c:/temp/tile%0.bmp").arg(i)); 
} 

我希望按鈕在每個瓦片被渲染的一個來回,但結果是完全不同的:

Tile 0Tile 2
Tile 1Tile 3

上面的瓷磚編號是:

如何正確設置QPainter的(或achive我需要什麼)?

回答

0

我結束了繞過QPainter,做計算自己和直接調用QWidget::render()

QRect viewport(i*w,j*h, w,h); 
QRect intersection = viewport.intersected(widget->frameGeometry()); 
if (!intersection.isEmpty()) { 
    QPoint target = intersection.topLeft() - viewport.topLeft(); 
    QPoint topLeft = widget->mapFromGlobal(intersection.topLeft()); 
    QPoint bottomRight = widget->mapFromGlobal(intersection.bottomRight());  
    widget->render(&paintDevice, target, QRegion(intersection)); 
}