Qt 如何在QPixmap上使用QPainter

Qt 如何在QPixmap上使用QPainter,qt,qt4,qgraphicsscene,qpainter,qpixmap,Qt,Qt4,Qgraphicsscene,Qpainter,Qpixmap,我是Qt/Embedded的新手。我想使用QPainter在QPixmap上绘制东西,它将被添加到qgraphicscene。这是我的密码。但它不会在pixmap上显示图形。它只显示黑色的像素贴图 int main(int argc, char **argv) { QApplication a(argc, argv); QMainWindow *win1 = new QMainWindow(); win1->resize(500,500); win1->show(

我是Qt/Embedded的新手。我想使用
QPainter
QPixmap
上绘制东西,它将被添加到
qgraphicscene
。这是我的密码。但它不会在pixmap上显示图形。它只显示黑色的像素贴图

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

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

您还需要在使用pixmap之前销毁
qPaint
,以确保所有更改都将写入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);

在将位图添加到场景之前,需要在位图上进行绘制。将其添加到场景中时,场景将使用它构造一个
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
...
或:


封装
QPainter::begin
QPainter::end
之间的
QPainter
调用而不是销毁它是否相同?
begin
在构造函数中自动调用。您可以在不删除对象的情况下调用
end
,稍后调用
begin
以重用该对象。当然,总有一天你会毁掉它的。但是创建
QPainter
而不创建
new
更方便,可以自动删除它。在两次绘画动作之间保留同一个画家是没有意义的。建造油漆工是一种廉价的操作。这个答案对我很有帮助。在更新
QPixmap
value实例之后,我意外地调用了
QPainter::end()
。这导致了难以修复的分段故障。是的,
QPixmap
通常使用
new
关键字创建,但ctor
QPainter(PaintDevice*)
(或方法
begin(PaintDevice*)
)需要指针。使用指向
QPixmap
的值实例的指针时要小心<代码>绘制->设置笔(*(新QColor(255,34255255))多么可怕的内存泄漏!只要做
paint->setPen(QColor(255,34255255))QPainter也会泄漏,它也应该用于堆栈。
...
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
...