2013-07-26 37 views
8

Sono un principiante di Qt/Embedded. Voglio utilizzare QPainter per disegnare materiale su un QPixmap, che verrà aggiunto a QGraphicsScene. Ecco il mio codice. Ma non mostra i disegni sulla pixmap. Mostra solo la pixmap nera.Come utilizzare QPainter su 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

'officine di verniciatura> setPen (* (nuova QColor (255,34,255,255)));' quello che una perdita di memoria orribile! Basta fare 'paint-> setPen (QColor (255,34,255,255));' –

+0

QPertiene anche perdite, si suppone anche che vengano utilizzate in pila. –

risposta

8

QPixmap dovrebbe essere creata senza new parola chiave. Di solito è passato per valore o riferimento, non per puntatore. Uno dei motivi è che QPixmap non è in grado di tracciare le sue modifiche. Quando aggiungi una pixmap a una scena utilizzando addPixmap, viene utilizzata solo la pixmap corrente. Ulteriori cambiamenti non influenzeranno la scena. Quindi è necessario chiamare addPixmap dopo aver apportato le modifiche.

Inoltre è necessario distruggere QPainter prima di utilizzare la pixmap per garantire che tutte le modifiche vengano scritte nella pixmap e per evitare perdite di memoria.

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

è lo stesso per incapsulare le chiamate di 'QPainter' tra' QPainter :: begin' e 'QPainter :: end' invece di distruggerlo? – nkint

+1

'begin' viene chiamato automaticamente nel costruttore. Puoi chiamare "end" senza cancellare l'oggetto e chiamare "begin" in seguito per riutilizzare l'oggetto. Certo, devi finalmente distruggerlo un po 'di tempo. Ma è più conveniente creare 'QPainter' senza' new' per cancellarlo automaticamente. Non ha senso preservare lo stesso pittore tra due azioni pittoriche. Costruire pittori è un'operazione economica. –

12

Hai bisogno di fare il dipinto sulla bitmap prima di aggiungerlo alla scena. Quando lo aggiungi alla scena, la scena lo userà per costruire un oggetto QGraphicsPixmapItem, che viene anche restituito dalla funzione addPixmap(). Se si desidera aggiornare la pixmap dopo che è stata aggiunta, è necessario chiamare la funzione setPixmap() dell'oggetto QGraphicsPixmapItem restituito.

Quindi, o:

... 
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 
... 

o:

... 
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 
...