如何拍摄窗口的屏幕截图并使用QML将其显示在图像上?

时间:2016-10-27 04:14:42

标签: qt qml

我想使用代码

拍摄一个屏幕截图
 QImage img = currentView_->grabWindow();

我希望使用QML在我的GUI上显示此屏幕截图。 怎么做?

1 个答案:

答案 0 :(得分:0)

如果你想将图像从C ++传输到QML,我认为最好的方法是QQuickImageProvider。下面的小例子可能与你想要的有点不同,但无论如何:

QQuickImageProvider类:

#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++));
}

在main.cpp中注册:

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()));

用法:

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;
    }
}