0

デバイスのピクセル比が 2x に設定されている場合 (4K モニターで適切に表示するため)、高解像度の画像を描画しようとしています。ペインターにピックスマップを直接描画するとうまくいきます。

int pixelRatio = 2;
QPixmap myImage = ...;
auto pxm = myImage.scaled(imgDiameter * pixelRatio, imgDiameter * pixelRatio, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
pxm.setDevicePixelRatio(pixelRatio);
painter->drawPixmap(QPoint(xPos, yPos), pxm);

ただし、不規則な形状の上に画像を描画する必要があるため、ブラシを使用します。

int pixelRatio = 2;
QPixmap myImage = ...;
auto oldBrush = painter->brush();
auto pxm = myImage.scaled(imgDiameter * pixelRatio, imgDiameter * pixelRatio, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
pxm.setDevicePixelRatio(pixelRatio);
QBrush brush(pxm);
painter->setPen(Qt::NoPen);
painter->setBrush(brush);
painter->setBrushOrigin(xPos, yPos);
painter->drawEllipse(xPos, yPos, imgDiameter, imgDiameter);
painter->setBrush(oldBrush);

ブラシが塗りつぶされると、ピックスマップの devicePixelRatio に準拠していないように見えるため、シェイプ内のピックスマップは 2 倍の大きさになります。

私がしていることに何か問題がありますか?

4

1 に答える 1

0

最初に必要なものをピックスマップに描画し、次にピックスマップに必要なデバイスピクセル比を設定してから、このピックスマップを描画する必要があります

 if (pix.devicePixelRatio() == 2.0) {
        QPixmap output(pix.size());
        output.fill(Qt::transparent);
        QPainter pixPainter(&output);

        pixPainter.setBrush(pix);
        pixPainter.setPen(Qt::transparent);
        pixPainter.setRenderHint(QPainter::Antialiasing);
        QPainterPath path;
        path.add(...);
        ...
        pixPainter.drawPath(path);
        output.setDevicePixelRatio(pix.devicePixelRatio());
        painter.drawPixmap(0,0,output);
    }
于 2016-02-09T12:26:26.977 に答える