Qt 拍摄QML视图的快照

Qt 拍摄QML视图的快照,qt,qml,qtquick2,snapshot,application-design,Qt,Qml,Qtquick2,Snapshot,Application Design,我想拍摄QML视图的快照并将其保存在磁盘上的某个位置 这可能吗 为简单起见,假设视图是日历 Calendar { id: calendar anchors.fill: parent } 是的,很简单: calendar.grabToImage(function(result) { result.saveToFile("something.png") }); 是的,很简单: calendar.grabToImage(function(re

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

这可能吗

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

    Calendar
    {
        id: calendar
        anchors.fill: parent
    }
是的,很简单:

calendar.grabToImage(function(result) { result.saveToFile("something.png") });
是的,很简单:

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

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

QQuickWindow/QQuickView等-它具有返回所包含内容的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,你就可以把它存储为一个文件


由于您有查看日历,因此可以直接使用它,无需在其他对象中搜索它。

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

QQuickWindow/QQuickView等-它具有返回所包含内容的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,你就可以把它存储为一个文件


因为你有你的视图日历,你可以直接使用它,并且不需要在其他对象中搜索它。

< P>可以从QML或从C++中获取一个项目的快照。还可以查看整个窗口的快照。

< P>可以从QML或C++中获取一个项目的快照。还有一个功能是拍摄整个窗口的快照。

效果非常好!谢谢很好用!谢谢谢谢你的回答。但由于我使用的是QQmlApplicationEngine,所以当我想要获取的项目不是根项目时,我必须搜索它。@dtech提供的解决方案在我的情况下更好,因为这样我可以从QML内完成所有工作。我不知道你可以从QML内获取图像,所以这对我来说肯定也是新的。谢谢你的回答。但由于我使用的是QQmlApplicationEngine,所以当我想要获取的项目不是根项目时,我必须搜索它。@dtech提供的解决方案在我的情况下更好,因为这样我可以从QML中做任何事情。我不知道你可以从QML中获取图像,所以它对我来说肯定也是新的东西。