2

カスタム イメージをテクスチャとして持つエンティティを Qt3D で作成したいと考えています。QPaintedTextureImage (詳細については、Qt 5.9 バージョンへのリンク。5.8 のドキュメントはこちら)に出会いました。これは QPainterで記述できますが、方法がわかりません。まず、これはエンティティが次のように見えると私が想像する方法です。

[編集]: コードが編集され、動作するようになりました!

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);
};

planeEntity に大きな円を描画したいだけの場合、ペイント関数に渡された 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);
}
4

2 に答える 2

2

簡単な答えは...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ただし、メソッドを直接呼び出すべきではないことに注意してください。代わりにupdatewhich を使用して Qt に再描画をスケジュールさせ、 を初期化し、オーバーライドされたメソッドをそのペインタへのポインタでQPainter呼び出します。paint

于 2017-04-06T13:04:53.217 に答える