2017-04-06 14 views
1

カスタムイメージをテクスチャとして持つQt3Dでエンティティを作成したいとします。私はQPaintedTextureImageを見つけました(詳細はQt 5.9バージョンへのリンクがあります。ist doc for 5.8)。これはQPainterで書かれていますが、わかりません。 まず、エンティティが次のように見えると思います。Qt3DのQPaintedTextureImage(Qt 5.8)

[編集]:コードが編集され、今すぐ機能します!

planeEntity = new Qt3DCore::QEntity(rootEntity); 

planeMesh = new Qt3DExtras::QPlaneMesh; 
planeMesh->setWidth(2); 
planeMesh->setHeight(2); 

image = new TextureImage; //see below 
image->setSize(QSize(100,100)); 
painter = new QPainter; 
image->paint(painter) 

planeMaterial = new Qt3DExtras::QDiffuseMapMaterial; 
planeMaterial->diffuse()->addTextureImage(image); 

planeEntity->addComponent(planeMesh); 
planeEntity->addComponent(planeMaterial); 

TextureImageは、ペイント機能を持つサブクラス化QPaintedTextureImageです:私はちょうど大きな円を描きたい場合は

class TextureImage : public Qt3DRender::QPaintedTextureImage 
{ 
public:  
    void paint(QPainter* painter); 
}; 

何の機能をペイントするために渡されたQPainterのは、塗料の実装で行う必要がありません飛行機に入る?

[編集]実装:

void TextureImage::paint(QPainter* painter) 
{ 
    //hardcoded values because there was no device()->width/heigth 
    painter->fillRect(0, 0, 100, 100, QColor(255, 255, 255)); 

    /* Set pen and brush to whatever you want. */ 
    painter->setPen(QPen(QBrush(QColor(255, 0, 255)) ,10)); 
    painter->setBrush(QColor(0, 0, 255)); 

    /* 
    * Draw a circle (or an ellipse -- the outcome depends very much on 
    * the aspect ratio of the bounding rectangle amongst other things). 
    */ 
    painter->drawEllipse(0, 0, 100, 100); 
} 

答えて

1

短い答えは...あなたは通常どおりQPainterまったく同じ方法を使用します。

void TextureImage::paint (QPainter* painter) 
{ 
    int w = painter->device()->width(); 
    int h = painter->device()->height(); 

    /* Clear to white. */ 
    painter->fillRect(0, 0, w, h, QColor(255, 255, 255)); 

    /* Set pen and brush to whatever you want. */ 
    painter->setPen(QPen(QBrush(QColor(0, 0, 0)) ,10)); 
    painter->setBrush(QColor(0, 0, 255)); 

    /* 
    * Draw a circle (or an ellipse -- the outcome depends very much on 
    * the aspect ratio of the bounding rectangle amongst other things). 
    */ 
    painter->drawEllipse(0, 0, w, h); 
} 

ただし、実際にpaintメソッドを直接呼び出すべきではありません。代わりにupdateを使用すると、Qtは再ペイントをスケジュールし、QPainterを初期化し、オーバーライドされたpaintメソッドをそのペインタへのポインタで呼び出すことができます。

+0

それは小さな変更で働いていた、ありがとう! – user7825011

0

QMLで必要な画像を動的に読み込むほうが簡単かもしれません。 は私がいないので、ずっと前にそれをしなければならなかったし、そのためのSOに質問を開いた:

Qt3D dynamic texture

関連する問題