首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QQuickWindow::grabWindow:已在使用的场景图

QQuickWindow::grabWindow:已在使用的场景图
EN

Stack Overflow用户
提问于 2015-10-16 08:24:39
回答 1查看 1.2K关注 0票数 3

我尝试了这里显示的代码:如何获取ScreenShot Qt/QML

在执行时,我将在标题中写入错误。

我的main.cpp是:

代码语言:javascript
复制
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQuickWindow>
#include <QImage>
#include <QDebug>
#include "screenshot.h"
#include <QQuickView>
#include <QQmlContext>

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

    const char* drigUi = "DrigUI"; 
    qmlRegisterType <screenCapture> (drigUi, 1, 0, "ScreenShot");

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    return app.exec();
}

我使用了这个捕获函数:

代码语言:javascript
复制
void screenCapture::capture(QString const &path) const
{
    QImage img = currentView_->grabWindow();
    img.save(path);
}

并在构造函数中添加了以下内容:

代码语言:javascript
复制
currentView_ = new QQuickView;

我的main.qml

代码语言:javascript
复制
import QtQuick 2.4
import QtQuick.Window 2.2

import DrigUI 1.0

Window
{
    visible: true
    height: 370
    width: 370

    ScreenShot { id: screenShot }

    Rectangle
    {
        id: ll
        height: 30
        width: 50
        x: 180; y: 0; color: "red"
        MouseArea
        {
            anchors.fill: parent
            onClicked: screenShot.capture ("l.png")
        }
    }
}

这个错误是什么意思?解决这个问题的方法是什么?我还能在这里提供什么信息?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-17 05:34:11

我在QtCenter.org也是,从那里得到了启示。上发布了这个问题

我问你为什么要创建一个空QQuickView的屏幕截图?难道你不想拍下你在QML中创建的窗口的截图吗?

我意识到我并没有在main.cpp的任何地方使用main.cpp。因此,这意味着我使用的QQuickView是空的。

程序的另一部分是使用QQuickWindow而不是QQuickView,因此我将QQuickView替换为QQuickWindow,如下所示:

ScreenCapture.h

代码语言:javascript
复制
#ifndef SCREENSHOT_H
#define SCREENSHOT_H

#include <QObject>

class QString;
class QQuickWindow;

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

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

private:
    QQuickWindow *currentWindow;
};

#endif // SCREENSHOT_H

ScreenCapture.cpp

代码语言:javascript
复制
#include <QPixmap>
#include <QQuickView>
#include <QDebug>
#include "screenshot.h"

screenCapture::screenCapture(QQuickWindow *currentWindow) :
    QObject(0), currentWindow (currentWindow)
{
}

void screenCapture::capture (QString const &path) const
{
    QImage p = currentWindow->grabWindow ();
    bool kk = p.save (path);
    qDebug () << kk;
}

main.cpp

代码语言:javascript
复制
int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    QObject      *topLevel = engine.rootObjects().value(0);
    QQuickWindow *window   = qobject_cast<QQuickWindow *>(topLevel);

    screenCapture launcher (window);

    engine.rootContext()->setContextProperty("ScreenShot", &launcher);

    window->show();

    return app.exec();
}

现在,在QML方面,我们可以直接使用

ScreenShot.capture ("/home/*****/Desktop/l.png")

任何我们想要的地方。它起作用了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33165733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档