Wie zu verwenden QPainter auf QPixmap
Ich bin ein Neuling auf Qt/Embedded. Ich will QPainter
zu zeichnen Zeug auf einem QPixmap
, die Hinzugefügt werden, um QGraphicsScene
. Hier ist mein code. Aber es zeigt nicht die Zeichnungen, auf die pixmap. Es zeigt nur schwarz pixmap.
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)));
was für ein furchtbarer memory-leak! Nur tunpaint->setPen(QColor(255,34,255,255));
- QPainter Lecks zu, es auch annehmen, um verwendet werden, auf Stapel.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie die Malerei auf die bitmap vor fügen Sie es zu der Szene. Wenn Sie es hinzufügen, um die Szene, die Szene wird es verwenden, um zu konstruieren, ein
QGraphicsPixmapItem
- Objekt, das auch wieder durch dieaddPixmap()
Funktion. Wenn Sie möchten, aktualisieren Sie die pixmap, nachdem es Hinzugefügt wurde, müssen Sie rufen Sie diesetPixmap()
Funktion der zurückgegebenenQGraphicsPixmapItem
Objekt.Also entweder:
oder:
QPixmap
geschaffen werden sollte, ohnenew
Schlüsselwort. Es ist in der Regel durch Wert übergeben oder als Referenz, nicht durch Zeiger. Einer der Gründe ist, dassQPixmap
ist nicht in der Lage tracking Ihrer änderungen. Wenn Sie eine pixmap zu einer Szene mitaddPixmap
nur das aktuelle pixmap verwendet wird. Weitere änderungen wirken sich nicht auf die Szene. So rufen SieaddPixmap
nachdem Sie änderungen vornehmen.Werden Sie brauchen, um zu zerstören
QPainter
bevor Sie mit der pixmap, um sicherzustellen, dass alle änderungen geschrieben werden, um die pixmap und zu vermeiden Speicherverlust.QPainter
Anrufe zwischenQPainter::begin
undQPainter::end
statt Sie zu zerstören?begin
wird automatisch aufgerufen im Konstruktor. Sie können rufen Sieend
löschen, ohne das Objekt, und rufen Siebegin
später wiederverwenden des Objekts. Natürlich, schließlich müssen Sie es zerstören einige Zeit. Aber es ist bequemer zu erstellen, dieQPainter
ohnenew
um es automatisch gelöscht. Es gibt keinen Punkt in der Erhaltung der gleichen Maler zwischen zwei malen Aktionen. Bau-Maler ist eine billige operation.