【问题标题】:How to use QPainter on QPixmap如何在 QPixmap 上使用 QPainter
【发布时间】:2013-07-27 03:54:22
【问题描述】:

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

【问题讨论】:

  • paint->setPen(*(new QColor(255,34,255,255))); 多么可怕的内存泄漏!就做paint->setPen(QColor(255,34,255,255));
  • QPainter 也泄漏,它也应该在堆栈上使用。

标签: qt qt4 qgraphicsscene qpainter qpixmap


【解决方案1】:

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

【讨论】:

  • 在QPainter::begin和QPainter::end之间封装QPainter调用而不是销毁是不是一样?
  • begin 在构造函数中被自动调用。您可以在不删除对象的情况下调用end,稍后再调用begin 以重用该对象。当然,你必须最终摧毁它一段时间。但是创建QPainter而不使用new会更方便,使其自动删除。在两个绘画动作之间保留同一个画家是没有意义的。建造油漆工是一项廉价的操作。
  • 这个答案对我很有帮助。我在更新QPixmap 值实例之后不小心调用了QPainter::end()。这导致了难以修复的分段错误。是的,QPixmap 通常是用 new 关键字创建的,但 ctor QPainter(PaintDevice*)(或方法 begin(PaintDevice*))需要一个指针。小心使用指向 QPixmap 的值实例的指针!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-08
    • 1970-01-01
    • 2020-11-25
    • 1970-01-01
    相关资源
    最近更新 更多