2013-06-13 88 views
5
私はそれがQtQuick2に

スクリーンショットの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に

を動作させることはできません QtQuick1 example

#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") 
     } 
    } 
} 

エラーメッセージ

QPixmapの:: grabWidgetは廃止され、QWidgetのに使用::グラブ()の代わりに QMetaObject ::は、invokeMethod:そのような方法QQuickView ::グラブ(QRect)

+0

に「キャプチャ」機能を変更する、かなり簡単な解決策を見つけた:http://stackoverflow.com/questioをns/17146747/capture-qml-drawing-buffer-without-displaying – Dmitry

答えて

6

私はあなたがこの例で使用することができますQt5 QML Quick2について

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