web-dev-qa-db-ja.com

QPixmapでQPainterを使用する方法

私はQt/Embeddedの初心者です。 QPainterを使用してQPixmapに描画し、QGraphicsSceneに追加します。これが私のコードです。ただし、ピックスマップに描画は表示されません。黒のピックスマップのみを表示します。

int main(int argc, char **argv) {

  QApplication a(argc, argv);

  QMainWindow *win1 = new QMainWindow();
  win1->resize(500,500);
  win1->show();


  QGraphicsScene *scene = new QGraphicsScene(win1);
  QGraphicsView view(scene, win1);
  view.show();
  view.resize(500,500);

  QPixmap *pix = new QPixmap(500,500);
  scene->addPixmap(*pix);

  QPainter *Paint = new QPainter(pix);
  Paint->setPen(*(new QColor(255,34,255,255)));
  Paint->drawRect(15,15,100,100);

  return a.exec();
}
13
manmatha

ビットマップでペイントを行う必要がありますbeforeシーンに追加します。シーンに追加すると、シーンはそれを使用してQGraphicsPixmapItemオブジェクトを作成します。これは、addPixmap()関数からも返されます。追加された後にpixmapを更新する場合は、返されたQGraphicsPixmapItemオブジェクトのsetPixmap()関数を呼び出す必要があります。

だからどちらか:

...
QPixmap *pix = new QPixmap(500,500);
QPainter *Paint = new QPainter(pix);
Paint->setPen(*(new QColor(255,34,255,255)));
Paint->drawRect(15,15,100,100);
scene->addPixmap(*pix); // Moved this line
...

または:

...
QPixmap *pix = new QPixmap(500,500);
QGraphicsPixmapItem* item(scene->addPixmap(*pix)); // Save the returned item
QPainter *Paint = new QPainter(pix);
Paint->setPen(*(new QColor(255,34,255,255)));
Paint->drawRect(15,15,100,100);
item->setPixmap(*pix); // Added this line
...
18
Daniel Hedberg

QPixmapは、newキーワードなしで作成する必要があります。通常は、ポインタではなく、値または参照によって渡されます。その理由の1つは、QPixmapがその変更を追跡できないことです。 addPixmapを使用してシーンにピクスマップを追加すると、現在のピクスマップのみが使用されます。それ以上の変更はシーンには影響しません。したがって、変更を加えた後はaddPixmapを呼び出す必要があります。

また、pixmapを使用する前にQPainterを破棄して、すべての変更がpixmapに確実に書き込まれるようにし、メモリリークを回避する必要があります。

QPixmap pix(500,500);
QPainter *Paint = new QPainter(&pix);
Paint->setPen(QColor(255,34,255,255));
Paint->drawRect(15,15,100,100);
delete Paint;
scene->addPixmap(pix);
11
Pavel Strakhov