【发布时间】:2017-10-05 07:46:19
【问题描述】:
我想拍摄 QML 视图的快照并将其保存在磁盘上的某个位置。
这可能吗?
为简单起见,假设视图是一个日历
Calendar
{
id: calendar
anchors.fill: parent
}
【问题讨论】:
标签: qt qml qtquick2 snapshot application-design
我想拍摄 QML 视图的快照并将其保存在磁盘上的某个位置。
这可能吗?
为简单起见,假设视图是一个日历
Calendar
{
id: calendar
anchors.fill: parent
}
【问题讨论】:
标签: qt qml qtquick2 snapshot application-design
是的,这很容易:
calendar.grabToImage(function(result) { result.saveToFile("something.png") });
【讨论】:
这里重要的部分不是 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,您可以直接使用它,无需在其他对象中“搜索”它。
【讨论】:
grabImage() 所以这对我来说绝对是新事物。
可以使用 QML 中的 Item::grabToImage() 或 C++ 中的 QQuickItem::grabToImage() 对项目进行快照。还有QQuickWindow::grabImage() 用于拍摄整个窗口的快照。
【讨论】: