18

我是 Qt/Embedded 的新手。我想用来QPainter在 a 上画东西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();
}
4

2 回答 2

20

在将位图添加到场景之前,您需要在位图上进行绘制。当您将它添加到场景中时,场景将使用它来构造一个QGraphicsPixmapItem对象,该对象也由addPixmap()函数返回。如果要在添加后更新像素图,则需要调用setPixmap()返回QGraphicsPixmapItem对象的函数。

所以要么:

...
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
...
于 2013-07-26T19:24:42.037 回答
13

QPixmap应该在没有new关键字的情况下创建。它通常通过值或引用传递,而不是通过指针。原因之一QPixmap是无法跟踪其更改。使用 将像素图添加到场景addPixmap时,仅使用当前像素图。进一步的更改不会影响场景。因此,您应该addPixmap在进行更改后致电。

此外,您需要QPainter在使用像素图之前进行销毁,以确保所有更改都将写入像素图并避免内存泄漏。

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);
于 2013-07-26T19:24:33.123 回答