2012-03-24 3 views
0

Also hier ist, was ich versuche - Mit einem benutzerdefinierten QGraphicsItem, habe ich meine QPainter Setup in ein QImage zu malen, die ich dann in eine Datei (oder speichern behalte das QImage einfach im Speicher, bis ich es brauche).Malen Sie ein QGraphicsItem an ein QImage, ohne eine Szene/Ansicht zu benötigen

Das Problem, das ich gefunden habe, ist, dass QGraphicsItem :: paint() nur aufgerufen wird, wenn das QGraphsItem zu einer Szene gehört, die Szene gehört zu einer Ansicht UND die Ansicht und Szene sind nicht ausgeblendet.

Hier ist der Code außerhalb meines Projekts zu Testzwecken:

MyQGfx Class 
void MyQGfx::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) 
{ 
    qDebug() << "begin of paint function"; 
    QRectF rec = boundingRect(); 

    QImage image(boundingRect().size().toSize(), 
       QImage::Format_ARGB32_Premultiplied); 
    image.fill(0); 

    // construct a dedicated offline painter for this image 
    QPainter imagePainter(&image); 
    imagePainter.translate(-boundingRect().topLeft()); 

    // paint the item using imagePainter 
    imagePainter.setPen(Qt::blue); 
    imagePainter.setBrush(Qt::green); 
    imagePainter.drawEllipse(-50, -50, 100, 100); 

    imagePainter.end(); 


    if(image.save("C://plot.jpg")) 
    { 
     qDebug() << "written"; 
    } 
    else { 
     qDebug() << "not written"; 
    } 
} 

MainWindow Class 
.... 
QGraphicsView* view = new QGraphicsView(this); 
QGraphicsScene* scene = new QGraphicsScene(this); 
view->setScene(scene); 

MyQGfx* gfx = new MyQGfx(); 
scene->addItem(gfx); 
gfx->update(); 
.... 

Das alles funktioniert gut, aber ich möchte nicht, einen Blick/Szene notwendig, da es auf dem Hauptfenster angezeigt werden würde - es gibt jede Um es herum?

+0

Ich hatte definitiv nur einen duh Moment .. Ich habe schon eine Szene/Aussicht für etwas anderes. Ich kann das verwenden, um das QGraphicsItem zu halten. Ich werde dies jedoch offen lassen, falls jemand bessere Vorschläge für meine Arbeit hat oder um die ursprüngliche Frage zu beantworten, dass jemand anders ein QItem aus einem QGraphicsItem-Objekt speichern und vermeiden könnte, eine Szene/Ansicht zu benötigen wird im Dialog/Hauptfenster angezeigt. – giraffee

+0

Warum möchten Sie dort malen und nirgendwo anders? –

+0

Nach dem Umdenken brauche ich nicht einmal ein benutzerdefiniertes QGraphicsItem. Der Grund, warum ich es nur an das QImage malen möchte, besteht darin, es in eine QPixmap zu konvertieren, um es in einem QCursor zu verwenden. – giraffee

Antwort

2

Können Sie nicht einfach eine benutzerdefinierte Methode erstellen, die einen QPainter, ein Bild auf einem QImage und eines auf Ihrem Objekt akzeptiert?

+0

Yep - das ist, was ich getan habe. Ich musste meinen Maler immer noch aus irgendeinem Grund in die Graphikszene malen - ich nahm es nie heraus, weshalb es der Szene gezeigt wurde. Ich brauche nicht einmal ein benutzerdefiniertes QGraphics-Objekt, von dem ich annehme, was du wolltest. – giraffee

Verwandte Themen