Search code examples
qtdrawimageqpainter

Qt : draw triangle image


I need to do something similar to QPainter::drawImage, but drawing a triangle part of the given picture (into a triangular region of my widget) instead of working with rectangles.

Any idea how I could do that, besides painfully trying to redraw every pixel?

Thanks for your insights!


Solution

  • If it is feasible for you to use a QPixmap instead of a QImage, you can set a bitmap mask for the QPixmap which defines which of the pixels are shown and which are transparent:

    myPixmap->setMask(myTriangleMask);
    painter->drawPixmap(myPixmap);
    

    Here is another solution based on QImage:

    MaskWidget::MaskWidget(QWidget* parent) : QWidget(parent) {
       img = QImage("Sample.jpg");     // The image to paint
       mask = QImage("Mask.png");      // An indexed 2-bit colormap image
       QPainter imgPainter(&img);
       imgPainter.drawImage(0, 0, mask);  // Paint the mask onto the image
    }
    
    void MaskWidget::paintEvent ( QPaintEvent * event ) {
       QPainter painter(this);
       painter.drawImage(10, 10, img);
    }
    

    Mask.png is an image file with the same size as Sample.jpg. It contains an alpha channel to support transparency. You can create this file easily with The GIMP, for example. I added an alpha channel, changed all areas I want to have painted to transparent and all other areas to white. To reduce the size, I finally converted it to an indexed 2-bit image. You could even create the mask image programmatically with Qt, if you need your triangle be computed based on various parameters.