2013-07-26 5 views
8

Qt/Embedded의 초보자입니다. QPixmap에 그림을 그리려면 QPainter을 사용하고 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

'paint-> setPen (* (새 QColor (255,34,255,255))); '얼마나 끔찍한 메모리 누수! 그냥'paint-> setPen (QColor (255,34,255,255)); ' –

+0

QPainter가 누출 되어도 스택에 사용된다고 가정합니다. –

답변

8

QPixmapnew 키워드없이 만들어야합니다. 일반적으로 포인터가 아니라 값 또는 참조로 전달됩니다. 그 이유 중 하나는 QPixmap이 변경 사항을 추적 할 수 없다는 것입니다. addPixmap을 사용하여 픽스맵을 장면에 추가하면 현재 픽스맵 만 사용됩니다. 추가 변경 사항은 장면에 영향을 미치지 않습니다. 변경 한 후에 addPixmap으로 전화해야합니다.

pixmap을 사용하기 전에 QPainter을 삭제해야 모든 변경 사항이 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); 
+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 
...