拍摄 QML 视图的快照

Taking snapshot of a QML view

我想拍摄 QML 视图的快照并将其保存在磁盘上的某个位置。

这可能吗?

为简单起见,假设视图是日历

    Calendar
    {
        id: calendar
        anchors.fill: parent
    }

是的,这很容易:

calendar.grabToImage(function(result) { result.saveToFile("something.png") });

这里重要的部分不是您的 QML 视图的内容,而是您如何加载它?您是使用 QQuickWindow(或类似的 class)还是使用 QQmlApplicationEngine 来做到这一点?

  • QQuickWindow/QQuickView 等 - 它具有 grabWindow() 功能,其中 returns 包含
  • QImage
  • QQmlApplicationEngine - 您需要找到可以转换为 QQuickWindow 的根对象,然后按上述操作。

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    // Usually the top level object is your window so you can
    // omit the loop below and go straight for 
    // engine.rootObjects()[0] but it's still wise to check the 
    // result from the casting
    
    foreach(QObject* obj, engine.rootObjects()) {
      QQuickWindow* window = qobject_cast<QQuickWindow*>(obj);
      if (window) {
        QImage image = window->grabWindow();
        qDebug() << image;
      }
    }
    

获得 QImage 后,您可以 convert it to QPixmap 并将其存储为文件。

既然你有你的视图 Calendar 你可以直接使用它,而不需要 "search" 在其他对象中使用它。

可以对带有 Item::grabToImage() from QML, or with QQuickItem::grabToImage() from C++. There's also QQuickWindow::grabImage() 的项目进行快照,以便对整个 window 进行快照。