Как сделать снимок экрана приложения QML без QQuickView

Я хочу захватить экран моего приложения QML. Но мой корневой объект QML ApplicationWindow, поэтому я не могу использовать QQuickView показывать. Вместо этого я должен использовать QQmlApplicationEngine. Я знаю, как сделать скриншот с QQuickView (QQuickWindow::grabWindow), но не знаю, как взять его с QQmlApplicationEngine.

мой :

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

    ApplicationData appData;
    QQmlApplicationEngine engine;
    engine.load(QUrl("qrc:///main.qml"));
    return app.exec();
}

main.qml :

import QtQuick 2.1
import QtQuick.Controls 1.1
import QtQuick.Window 2.1


ApplicationWindow {
    id: mainWindow
    width: appData.screenWidth
    height: appData.screenHeight
    visible: true

    Rectangle {
        id: mainWindowBackground
        color: "red"
        anchors.fill: parent
    } 

    //...
}

2 ответов


можно использовать rootObjects() и приведите его результат к QQuickWindow:

foreach(QObject* obj, engine.rootObjects()) {
  QQuickWindow* window = qobject_cast<QQuickWindow*>(obj);
  if (window) {
    QImage image = window->grabWindow();
    qDebug() << image;
  }
}

вы можете применить ApplicationWindow(QML) к QQuickWindow (C++). Тогда будет легко сделать скриншот.

void ScreenShot(QQuickWindow *widget) {
    QPixmap pixmap = QPixmap::fromImage(widget->grabWindow());
    QFile f("your_name.png");
    f.open(QIODevice::WriteOnly);
    if(f.isOpen()) {
        pixmap.save(&f, "PNG");
    }