Как сделать снимок экрана приложения 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");
}