2013-07-26 5 views
8

Я новичок в Qt/Embedded. Я хочу использовать QPainter, чтобы нарисовать материал на QPixmap, который будет добавлен к QGraphicsScene. Вот мой код. Но он не показывает рисунки на pixmap. Он показывает только черный pixmap.Как использовать QPainter на QPixmap

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 не способен отслеживать изменения. Когда вы добавляете pixmap в сцену с помощью addPixmap, используется только текущая pixmap. Дальнейшие изменения не повлияют на сцену. Поэтому после внесения изменений вы должны позвонить addPixmap.

Также вам необходимо уничтожить QPainter, прежде чем использовать pixmap, чтобы все изменения были записаны в 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' между' QPainter :: begin' и 'QPainter :: end' вместо того, чтобы уничтожить его? – nkint

+1

'begin' автоматически вызывается в конструкторе. Вы можете вызвать 'end', не удаляя объект, и позже вызовите' begin' для повторного использования объекта. Конечно, вы должны, наконец, уничтожить его некоторое время. Но удобнее создавать 'QPainter' без' new', чтобы он автоматически удалялся. Нет смысла сохранять один и тот же художник между двумя действиями краски. Построение художников - дешевая операция. –

12

Вы должны сделать картину на растровом изображении перед тем добавить его на сцену. Когда вы добавите его в сцену, сцена будет использовать его для создания объекта QGraphicsPixmapItem, который также возвращается функцией addPixmap(). Если вы хотите обновить pixmap после его добавления, вам нужно вызвать функцию 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 
...