QQuickWindow::grabWindow: граф сцены уже используется

Я попробовал код, показанный здесь: Как взять ScreenShot Qt/QML

При исполнении я получаю ошибку, написанную в заголовке.

Мой main.cpp это:

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

Я использовал эту функцию захвата:

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

и добавил следующее в конструктор:

currentView_ = new QQuickView;

Мой main.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")
        }
    }
}

Что означает эта ошибка? Как это решить? Какую еще информацию я могу предоставить здесь?

1 ответ

Решение

Я также разместил этот вопрос на QtCenter.org и получил оттуда просветление.

Я спрашиваю, почему вы хотите создать скриншот пустого QQuickView? Не хотите ли сделать снимок экрана с окном, которое вы создаете в QML?

Я понял, что я не использовал QQuickView где-нибудь в main.cpp, так что это означало, что QQuickViewЯ использовала, была пуста.

Моя другая часть программы использует QQuickWindow вместо QQuickViewтак я заменил QQuickView с QQuickWindow следующее:

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

где угодно Оно работает.

Другие вопросы по тегам