[Solved]How to take ScreenShot Qt/QML



  • "QtQuick1 example":http://www.developer.nokia.com/Community/Wiki/How_to_take_ScreenShot_Qt/QML

    I can't make it work on QtQuick2

    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&#40;&#41;;
    

    }
    @

    main.qml
    @
    import QtQuick 2.0

    Rectangle{
    id : root
    width : 1024
    height : 768

    MouseArea{
        anchors.fill: root
    
        onClicked: {           
            console.log("save image"&#41;
            screenObject.capture("Pictures/saveTest.jpg"&#41;
        }
    }
    

    }
    @

    error message

    QPixmap::grabWidget is deprecated, use QWidget::grab() instead
    QMetaObject::invokeMethod: No such method QQuickView::grab(QRect)



  • I found a solution, pretty simple, change the function "capture" to

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


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.