と同様のことを行う必要がありますがQPainter::drawImage
、長方形を操作する代わりに、指定された画像の三角形の部分を (ウィジェットの三角形の領域に) 描画します。
すべてのピクセルを痛々しく再描画しようとする以外に、どうすればそれを行うことができるか考えていますか?
あなたの洞察に感謝します!
QImage の代わりに QPixmap を使用できる場合は、どのピクセルを表示し、どのピクセルを透明にするかを定義する QPixmapのビットマップ マスクを設定できます。
myPixmap->setMask(myTriangleMask);
painter->drawPixmap(myPixmap);
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 は、Sample.jpg と同じサイズの画像ファイルです。透明度をサポートするアルファ チャネルが含まれています。このファイルは、たとえば GIMP を使用して簡単に作成できます。アルファチャンネルを追加し、ペイントしたいすべての領域を透明に、他のすべての領域を白に変更しました。サイズを小さくするために、最終的にインデックス付きの 2 ビット イメージに変換しました。さまざまなパラメーターに基づいて三角形を計算する必要がある場合は、Qt を使用してプログラムでマスク イメージを作成することもできます。