2013-06-13 16 views
5

QtQuick1 example Nie mogę pracować na QtQuick2Jak wziąć zrzut ekranu Qt/QML

screenCapture.hpp

#include <QObject> 

class QString; 
class QQuickView; 

class screenCapture : public QObject 
{ 
    Q_OBJECT 
public:  
    explicit screenCapture(QQuickView *parent = 0); 

public slots: 
    void capture(QString const &path) const; 

private: 
    QQuickView *currentView_;  
}; 

screenCapture.cpp

#include <QPixmap> 
#include <QQuickView> 
#include <QString> 

#include "screenCapture.hpp" 

screenCapture::screenCapture(QQuickView *currentView) : 
    QObject(0), currentView_(currentView) 
{ 
} 

void screenCapture::capture(QString const &path) const 
{ 
    QPixmap::grabWidget(currentView_).save(path); 
} 

main.cpp

#include <QGuiApplication> 
#include <QQuickPaintedItem> 
#include <QQuickView> 
#include <QQmlContext> 

#include "screenCapture.hpp" 

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

    qmlRegisterType<screenCapture>("Image", 1, 0, "ScreenCapture"); 
    qmlRegisterType<saveAbleImage>("Image", 1, 0, "SaveAbleImage"); 

    QQuickView view; 
    view.setResizeMode(QQuickView::SizeRootObjectToView); 
    view.setSource(QStringLiteral("/Users/Qt/program/experiment_apps_and_libs/funnyCamera/qml/funnyCamera/main.qml")); 
    view.show(); 

    screenCapture screenClass(&view); 
    view.rootContext()->setContextProperty("screenObject", &screenClass); 

    return app.exec(); 
} 

main.qml

import QtQuick 2.0 

Rectangle{ 
    id : root 
    width : 1024 
    height : 768  

    MouseArea{ 
     anchors.fill: root 

     onClicked: {   
      console.log("save image") 
      screenObject.capture("Pictures/saveTest.jpg") 
     } 
    } 
} 

komunikat

QPixmap :: grabWidget jest przestarzała, użyj QWidget :: grab() zamiast QMetaObject :: invokeMethod: Nie ma takiego QQuickView metoda :: grab (QRect)

+0

dla Qt5 QML Quick2 można użyć tego przykładu: http://stackoverflow.com/questio ns/17146747/capture-qml-drawing-buffer-without-displaying – Dmitry

Odpowiedz

6

znalazłem rozwiązanie, dość proste, zmienić funkcję „przechwytywania” do

void screenCapture::capture(QString const &path) const 
{ 
    QImage img = currentView_->grabWindow(); 
    img.save(path); 
}