【问题标题】:Taking snapshot of a QML view拍摄 QML 视图的快照
【发布时间】:2017-10-05 07:46:19
【问题描述】:

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

这可能吗?

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

    Calendar
    {
        id: calendar
        anchors.fill: parent
    }

【问题讨论】:

    标签: qt qml qtquick2 snapshot application-design


    【解决方案1】:

    是的,这很容易:

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

    【讨论】:

    • 完美运行!谢谢!
    【解决方案2】:

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

    • QQuickWindow/QQuickView 等 - 它具有 grabWindow() 函数,该函数返回它所包含内容的 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,您可以直接使用它,无需在其他对象中“搜索”它。

    【讨论】:

    • 感谢您的回答。但是由于我使用的是QQmlApplicationEngine,所以当我要抓取的项目不是根项目时,我必须搜索它。 @dtech 提供的解决方案对我来说更好,因为这样我就可以在 QML 中做所有事情。
    • 我不知道你可以在 QML 中 grabImage() 所以这对我来说绝对是新事物。
    【解决方案3】:

    可以使用 QML 中的 Item::grabToImage() 或 C++ 中的 QQuickItem::grabToImage() 对项目进行快照。还有QQuickWindow::grabImage() 用于拍摄整个窗口的快照。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-14
      • 1970-01-01
      相关资源
      最近更新 更多