0

タイルレンダリングシステムを実装しています(GL_MAX_VIEWPORT_DIMS-limitationを回避するため)。QWidget-overlaysをサポートする必要があるため、ウィジェットのタイルレンダリングも実装する必要があります。計画は、正しい変換を使用してを作成し、「変換された」を使用してQPainter呼び出すことによってこれを行うことです。QWidget::renderQPainter

これを行うためのテストコードがいくつかあります。

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

ボタンの4分の1が各タイルにレンダリングされることを期待しますが、結果はまったく異なります。

タイル0 タイル2
タイル1 タイル3

上記のタイル番号は次のとおりです。

0 2
1 3

QPainterを正しく設定するにはどうすればよいですか(または必要なものを実現するには)?

4

1 に答える 1

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));
}
于 2011-11-02T13:11:30.037 に答える