2016-05-25 6 views
4

Ich versuche Netzwerk Bild anzuzeigen qml verwenden und dann das Bild speichern C++ Code,Speicher QML Bild in C++

Hier ist der QML-Code,

import QtQuick 2.3 
import QtQuick.Window 2.2 
import com.login 1.0 
Window { 
    visible: true 
    width : 500 
    height: 500 

    Login{id: login} 

    MouseArea { 
     anchors.fill: parent 
     onClicked: { 
      // Qt.quit(); 
      login.save(image); 
     } 
    } 



    Image { 
     id: image 
     source: "http://www.test.com/webp/gallery/4.jpg" 
    } 


} 

Und in meinem Login-Klasse Spar Bild wie,

void Login::save(QQuickItem *item) 
{ 
    qDebug()<<"width: "<<item->width(); 
    qDebug()<<"height: "<<item->height(); 

    QQuickWindow *window = item->window(); 
    QImage image = window->grabWindow(); 

    QPixmap pix = QPixmap::fromImage(image); 
    pix.save("C:/Users/haris/Desktop/output.png"); 
} 

ich die richtige Breite und Höhe des Bildes innerhalb C++ Klasse bin immer, aber das Problem ist, ich nicht einen Weg finden kann das Bild Artikel von QQuickItem zu speichern.

Momentan speichere ich das Bild, indem ich das Fenster eingrabe, das tatsächlich nicht die tatsächliche Bildgröße auf der Ausgabedatei gibt, sondern Ausgabedatei mit aktueller qml Fenstergröße gibt.

Grundsätzlich verfolge ich den Code hier saving QML image aber es scheint QDeclarativeItem in QT5 veraltet ist, so wähle ich QQuickItem wo, wie es in QQuickItem keine Farbe Option ist.

Antwort

7

Zum Glück QQuickItem hat eine bequeme grabToImage Funktion, die das tut.

void Login::save(QQuickItem *item) 
{ 
    auto grabResult = item->grabToImage(); 

    connect(grabResult.data(), &QQuickItemGrabResult::ready, [=]() { 
     grabResult->saveToFile("C:/Users/haris/Desktop/output.png"); 
     //grabResult->image() gives the QImage associated if you want to use it directly in the program 
    }); 
} 

Alternative Lösung ohne Lambda-Ausdrücke zu verwenden:

void Login::save(QQuickItem *item) 
{ 
    auto grabResult = item->grabToImage(); 

    /* Need to store grabResult somewhere persistent to avoid the SharedPointer mechanism from deleting it */ 
    ... 

    connect(grabResult.data(), SIGNAL(ready()), this, SLOT(onAsynchroneousImageLoaded())); 
} 

void Login::onAsynchroneousImageLoaded() { 
    auto grabResult = qobject_cast<QQuickItemGrabResult*>(sender()); 
    if (grabResult) { 
     grabResult->saveToFile("C:/Users/haris/Desktop/output.png"); 
    } else { 
     //something went wrong 
    } 
}); 
+0

Hallo Danke für die Antwort, habe ich versucht, beide 'grabResult-> saveToFile()' und 'grabResult-> Bild()' aber beide nicht, im ersten Fall gibt es immer 'false' und im zweiten Fall gibt es null Image, was könnte das Problem sein? – Haris

+0

Ich denke, das Problem ist, wie Docs sagt 'Der Greifer passiert asynchron und das Signal QQuickItemGrabResult :: ready() wird ausgegeben, wenn der Greifer abgeschlossen ist ', muss ich möglicherweise Ready-Signal verwenden. – Haris

+2

Danke, ich habe die Antwort mit Code bearbeitet, der das mit einer Lambda-Funktion behandelt, um auf das Signal zu reagieren. – coyotte508