2014-02-11 12 views
7

Ich möchte Bildschirm meiner QML-Anwendung greifen. Aber mein Wurzel-QML-Objekt ist ApplicationWindow, also kann ich QQuickView nicht verwenden, um es zu zeigen. Stattdessen muss ich QQmlApplicationEngine verwenden. Ich weiß, wie man mit QQuickView Screenshot (QQuickWindow::grabWindow), aber ich weiß nicht, wie man es mit QQmlApplicationEngine nehmen.Screenshot der QML-Anwendung ohne QQuickView

Meine main Datei:

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 

    ApplicationData appData; 
    QQmlApplicationEngine engine; 
    engine.load(QUrl("qrc:///main.qml")); 
    return app.exec(); 
} 

main.qml:

import QtQuick 2.1 
import QtQuick.Controls 1.1 
import QtQuick.Window 2.1 


ApplicationWindow { 
    id: mainWindow 
    width: appData.screenWidth 
    height: appData.screenHeight 
    visible: true 

    Rectangle { 
     id: mainWindowBackground 
     color: "red" 
     anchors.fill: parent 
    } 

    //... 
} 

Antwort

5

Sie rootObjects() verwenden können und werfen ihr Ergebnis QQuickWindow:

foreach(QObject* obj, engine.rootObjects()) { 
    QQuickWindow* window = qobject_cast<QQuickWindow*>(obj); 
    if (window) { 
    QImage image = window->grabWindow(); 
    qDebug() << image; 
    } 
} 
0

Sie können Application (QML) gegossen QQuickWindow (C++). Dann wird es einfach sein, Screenshot zu machen.

void ScreenShot(QQuickWindow *widget) { 
    QPixmap pixmap = QPixmap::fromImage(widget->grabWindow()); 
    QFile f("your_name.png"); 
    f.open(QIODevice::WriteOnly); 
    if(f.isOpen()) { 
     pixmap.save(&f, "PNG"); 
    }