sumit dhyani
sumit dhyani

Reputation: 53

Restrict drawing of qpainter over pixmap

I am using QGraphicsView and Scene over which two QGraphicsPixmap item are set. One is showing some image, another one is having transparent pixmap which is used to show marking.

I am using qpainter to draw over a transparent qpixmap.

I am using drawline between two points with qpen having rounded point with some pen size.

Problem is:

If i load some png image, with some part of image being transparent, I want to disable marking (on marking pixmap) over transparent region of image. Is there any way to automatically restrict area of marking of qpainter?

Upvotes: 0

Views: 687

Answers (1)

Martin Hennings
Martin Hennings

Reputation: 16866

It would be easiest to combine your two pixmaps into a single QGraphicsPixmapItem. Then you could simply use the correct QPainter::CompositionMode, which would need to be

QPainter::CompositionMode_SourceAtop

The source pixel is blended on top of the destination, with the alpha of the source pixel reduced by the alpha of the destination pixel.

e.g.:

QPixmap markingPixmap(sourceImage.size());
markingPixmap.fill(Qt::transparent);

{ // scope for painter1
    QPainter painter1(&markingPixmap);
    painter1.setPen(...);
    painter1.drawLine(...);
}

QPainter painter(&sourceImage);
painter.setCompositionMode(QPainter::CompositionMode_SourceAtop);
painter.drawPixmap(0, 0, markingPixmap);

(Code untested!)


Or you could even use a QBitmap, see QPainter::drawPixmap():

If pixmap is a QBitmap it is drawn with the bits that are "set" using the pens color. If backgroundMode is Qt::OpaqueMode, the "unset" bits are drawn using the color of the background brush; if backgroundMode is Qt::TransparentMode, the "unset" bits are transparent. Drawing bitmaps with gradient or texture colors is not supported.

(You would need to try if this respects the CompositionMode.)

Upvotes: 1

Related Questions