QQuickWindow::grabWindow:场景图形已经在使用

QQuickWindow::grabWindow: scene graph already in use

本文关键字:图形 grabWindow QQuickWindow      更新时间:2023-10-16

我尝试了这里显示的代码:如何截图Qt/QML

在执行时,我得到标题中写的错误。

My main.cpp is:

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

我使用了这个capture函数:

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

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

currentView_ = new QQuickView;
我的<<p> strong> 主要。qml :
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")
        }
    }
}

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

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

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

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

我的程序的另一部分是使用QQuickWindow而不是QQuickView,所以我用QQuickWindow代替QQuickView,如下所示:

ScreenCapture.h

#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

#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

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

我们想要的任何地方。它的工作原理。