2016-10-27 2 views
0

Ich möchte einen Screenshot aufzunehmen mit dem CodeWie nehme ich einen Screenshot des Fensters und zeige es mit QML auf einem Bild an?

QImage img = currentView_->grabWindow(); 

, und ich will diesen Screenshot mit QML auf meine GUI angezeigt werden soll. Wie geht das?

+0

Sie können den Screenshot in ein Bild speichern und mit QML laden. – dangsonbk

+0

Wie ist das möglich? Kann ich das nicht? –

+1

Was ist mit [grabToImage'] (http://doc.qt.io/qt-5/qml-qtquick-item.html#grabToImage-method) Beispiel? Es scheint perfekt zu Ihrem Anwendungsfall zu passen, nicht wahr? – BaCaRoZzo

Antwort

0

Wenn Sie ein Bild von C++ zu QML übertragen möchten, ist der beste Weg, ich denke, QQuickImageProvider. Das kleine Beispiel unten ist vielleicht ein bisschen anders aus, was Sie wollen, aber trotzdem:

QQuickImageProvider Klasse:

#ifndef IMAGEPROVIDER_H 
#define IMAGEPROVIDER_H 

#include <QQuickImageProvider> 
#include <QQuickView> 
#include <QImage> 

class ImageProvider : public QObject, public QQuickImageProvider 
{ 
    Q_OBJECT 
public: 
    ImageProvider(QObject *parent = 0, Flags flags = Flags()); 
    QImage requestImage(const QString &id, QSize *size, const QSize &requestedSize); 

protected: 
    QMap<int, QImage> m_images; 

public slots: 
    void makeScreenshot(); 
}; 

#endif // IMAGEPROVIDER_H 

#include "imageprovider.h" 

ImageProvider::ImageProvider(QObject *parent, Flags flags) : 
    QQuickImageProvider(QQmlImageProviderBase::Image, flags), 
    QObject(parent) 
{ 
} 

QImage ImageProvider::requestImage(const QString &id, QSize *size, const QSize &requestedSize) 
{ 
    bool ok = false; 
    QImage img = m_images[id.toInt(&ok)]; 
    return img; 
} 

void ImageProvider::makeScreenshot() 
{ 
    QQuickWindow *view = static_cast<QQuickWindow *>(sender()); 
    static int pos = 0; 
    QImage img = view->grabWindow(); 
    m_images.insert(pos,img); 

    QVariant returnedValue; 
    QMetaObject::invokeMethod(view, "setImage", 
           Q_RETURN_ARG(QVariant, returnedValue), 
           Q_ARG(QVariant, pos++)); 
} 

es in main.cpp Registrierung:

QQmlApplicationEngine engine; 
ImageProvider *imageProvider = new ImageProvider(); 
engine.addImageProvider(QLatin1String("screenshots"), imageProvider); 
engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); 

QQuickWindow *view = dynamic_cast<QQuickWindow *>(engine.rootObjects().at(0)); 

QObject::connect(view, SIGNAL(getScreenshot()), 
        imageProvider, SLOT(makeScreenshot())); 

Nutzungs :

import QtQuick 2.7 
import QtQuick.Window 2.0 

Window { 
    id:container 
    width: 600 
    height: 600 
    visible: true 
    signal getScreenshot() 

    Repeater { 
     model: 20 
     delegate: Rectangle { 
      x: Math.random() * 500 
      y: Math.random() * 500 
      width: Math.random() * 50 + 50 
      height: width 
      radius: width/2 
      color: Qt.rgba(Math.random(),Math.random(),Math.random(),1) 
     } 
    } 

    Text { 
     id: txt 
     anchors.centerIn: parent 
     text: "Click me" 
    } 

    Rectangle { 
     id: rect 
     anchors.centerIn: parent 
     width: 0 
     height: 0 
     border.width: 5 
     border.color: "black" 
     Image { 
      id: img 
      anchors.fill: parent 
      anchors.margins: 5 
      source: "" 
      fillMode: Image.PreserveAspectFit 
     } 
     ParallelAnimation { 
      id: anim 
      PropertyAnimation { 
       property: "width" 
       target: rect 
       from: 0 
       to: 200 
       duration: 500 
      } 
      PropertyAnimation { 
       property: "height" 
       target: rect 
       from: 0 
       to: 200 
       duration: 500 
      } 
     } 
    } 

    MouseArea { 
     anchors.fill: parent 
     onClicked: { 
      txt.visible = false; 
      container.getScreenshot(); 
     } 
    } 

    function setImage(id) 
    { 
     img.source = "image://screenshots/" + id; 
     anim.running = true; 
    } 
} 
Verwandte Themen