2012-01-01 7 views
0

カスタマイズしたQWidgetのpaintEventメソッドでは、円の形をした画像アイコンで円を描きたいと思います。ソースイメージはファイルからロードされ、QPainterコンポジションを使用して自動的に円にキャストされます。どうやってするの?ありがとうございました!イメージファイルから円アイコンを作成する方法は?

void DotGraphView::paintNodes(QPainter & painter) 
{ 
    painter.setPen(Qt::blue); 
    painter.drawEllipse(x, y, 36, 36); 
    QPixmap icon("./image.png"); 
    QImage fixedImage(64, 64, QImage::Format_ARGB32_Premultiplied); 
    QPainter imgPainter(&fixedImage); 
    imgPainter.setCompositionMode(QPainter::CompositionMode_SourceIn); 
    imgPainter.drawPixmap(0, 0, 64, 64, icon); 
    imgPainter.setCompositionMode(QPainter::CompositionMode_SourceIn); 
    imgPainter.setBrush(Qt::transparent); 
    imgPainter.drawEllipse(32, 32, 30, 30); 
    imgPainter.end(); 
    painter.drawPixmap(x, y, 64, 64, QPixmap::fromImage(fixedImage)); 
} 

上記のコードは機能しません。出力表示は円形のイメージではありません。

+1

どのように動作しないかを詳しく説明してください。それはコンパイルされますか?それはまったく動いていますか?それは間違った出力を作り出しますか?どのように? –

+0

出力ディスプレイは円形のイメージではありません。 – allenchen

+0

正確には何ですか?スクリーンショットをアップロードできますか? – Cydonia7

答えて

0

あなたはクリッピングパスで比較的簡単にこれを行うことができます。

QPainter painter(this); 
painter.setPen(Qt::blue); 
painter.drawEllipse(30, 30, 36, 36); 
QPixmap icon("./image.png"); 

QImage fixedImage(64, 64, QImage::Format_ARGB32_Premultiplied); 
fixedImage.fill(0); // Make sure you don't have garbage in there 

QPainter imgPainter(&fixedImage); 
QPainterPath clip; 
clip.addEllipse(32, 32, 30, 30); // this is the shape we want to clip to 
imgPainter.setClipPath(clip); 
imgPainter.drawPixmap(0, 0, 64, 64, icon); 
imgPainter.end(); 

painter.drawPixmap(0, 0, 64, 64, QPixmap::fromImage(fixedImage)); 

(。あなたは、多くの場合、この操作を行う場合、私はピックスマップをキャッシュしたい)

3

私が正しく理解している場合、私は知りません、これは、あなたがやりたいことがあります

#include <QtGui/QApplication> 
#include <QLabel> 
#include <QPixmap> 
#include <QBitmap> 
#include <QPainter> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    // Load the source image. 
    QPixmap original(QString("/path/here.jpg")); 
    if (original.isNull()) { 
     qFatal("Failed to load."); 
     return -1; 
    } 

    // Draw the mask. 
    QBitmap mask(original.size()); 
    QPainter painter(&mask); 
    mask.fill(Qt::white); 
    painter.setBrush(Qt::black); 
    painter.drawEllipse(QPoint(mask.width()/2, mask.height()/2), 100, 100); 

    // Draw the final image. 
    original.setMask(mask); 

    // Show the result on the screen. 
    QLabel label; 
    label.setPixmap(original); 
    label.show(); 

    return a.exec(); 
} 

キャッシュ画面にあなたのQWidgetのサブクラスとブリットあなたのペイントイベントに必要なバウンディング矩形で結果を要求しました。

関連する問題