2013-07-26 47 views
8

我是Qt/Embedded的新手。我想用QPainterQPixmap上画东西,这会被添加到QGraphicsScene。这是我的代码。但它不会在像素图上显示图纸。它只显示黑色像素图。如何在QPixmap上使用QPainter

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

'漆料> setPen(*(新的QColor(255,34,255,255)));'什么可憎的内存泄漏!只要执行'paint-> setPen(QColor(255,34,255,255));' –

+0

QPainter也会泄漏,它也可以用于堆栈。 –

回答

8

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

是不是将'QPainter :: begin'和'QPainter :: end'之间的'QPainter'调用封装起来而不是销毁它? – nkint

+1

'begin'在构造函数中被自动调用。你可以在不删除对象的情况下调用'end'并稍后调用'begin'来重用对象。当然,你最终必须摧毁它。但是创建没有'new'的'QPainter'使它自动删除会更方便。在两个绘画动作之间保留相同的画家没有任何意义。建造画家是一项便宜的操作。 –

12

您需要之前做的位图画你把它添加到场景中。将它添加到场景中时,场景将使用它构造一个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 
...