web-dev-qa-db-fra.com

Comment utiliser QPainter sur QPixmap

Je suis novice en Qt/Embedded. Je veux utiliser QPainter pour dessiner des trucs sur un QPixmap, qui sera ajouté à QGraphicsScene. Voici mon code. Mais il ne montre pas les dessins sur le pixmap. Il montre uniquement le pixmap noir.

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

Vous devez faire la peinture sur le bitmap avant vous l'ajoutez à la scène. Lorsque vous l'ajoutez à la scène, la scène l'utilise pour construire un objet QGraphicsPixmapItem, qui est également renvoyé par la fonction addPixmap(). Si vous souhaitez mettre à jour le pixmap après son ajout, vous devez appeler la fonction setPixmap() de l'objet QGraphicsPixmapItem retourné.

Donc soit:

...
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
...

ou:

...
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 doit être créé sans le mot clé new. Il est généralement transmis par valeur ou référence, et non par pointeur. L'une des raisons est que QPixmap n'est pas capable de suivre ses modifications. Lorsque vous ajoutez une pixmap à une scène à l'aide de addPixmap, seule la pixmap actuelle est utilisée. D'autres modifications n'affecteront pas la scène. Vous devez donc appeler addPixmap après avoir apporté des modifications.

Vous devez également détruire QPainter avant d'utiliser le pixmap pour vous assurer que toutes les modifications seront écrites sur le pixmap et pour éviter une fuite de mémoire.

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