簡體   English   中英

使用QPainter進行平鋪渲染

[英]Tiled rendering with QPainter

我正在實現GL_MAX_VIEWPORT_DIMS化渲染系統(以避免GL_MAX_VIEWPORT_DIMS -limitation)。 我需要支持QWidget -overlays,因此也必須為小部件實現平鋪渲染。 計划是通過創建具有正確轉換的QPainter並使用“已轉換的” QPainter調用QWidget::render來實現的。

我有一些測試代碼可以做到這一點:

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));
}

我希望在每個圖塊中呈現按鈕的四分之一,但結果卻大不相同:

瓦0瓷磚2
瓷磚1瓷磚3

上面的圖塊編號為:

0 2
1 3

如何正確設置QPainter(或實現我所需要的)?

我最終繞過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));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM