首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QQuickWidget: grabToImage:项目的窗口不可见

QQuickWidget: grabToImage:项目的窗口不可见
EN

Stack Overflow用户
提问于 2019-12-23 18:28:09
回答 1查看 959关注 0票数 1

当我尝试使用Item::grabToImage() qml方法时,我遇到了问题。无论我指向哪一项,它总是指出以下错误:

grabToImage:项目的窗口不可见

我也尝试使用名为rect的root/toplevel项,但它没有起作用。

我的目标是:我想要捕捉一个矩形大小的图像,并在其上绘制贴图和多边形。

下面是一个最小的可重复的例子

代码语言:javascript
复制
import QtQml 2.2
import QtLocation 5.9
import QtPositioning 5.9
import QtQuick 2.0
import QtQuick.Controls 2.4

Item {
    id: rect
    width: 1024
    height: 768

    visible: true

    Plugin {
        id: mapPlugin
        name: "osm"
    }

    Map {
        id: map
        enabled: true
        visible: true
        parent: rect
        gesture.enabled: true
        anchors.fill: parent
        plugin: mapPlugin
        zoomLevel: 14
        activeMapType: supportedMapTypes[3]
    }

    Item {
        anchors.bottom: parent.bottom
        anchors.left: parent.left
        anchors.right: parent.right
        anchors.margins: 10
        height: 40

        Button {
            id: saveToDisk
            text: qsTr("Pick")
            onClicked: {
                map.grabToImage(function (result) {
                    console.log('saving to disk..')
                    result.saveToFile("pick.png")
                })
            }
        }
    }
}
代码语言:javascript
复制
#include <QApplication>
#include <QQmlApplicationEngine>
#include <QtQuickWidgets/QQuickWidget>

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QApplication app(argc, argv);

    QQuickWidget *q = new QQuickWidget;
    q->setResizeMode(QQuickWidget::SizeRootObjectToView);
    q->setSource(QUrl("main.qml"));
    q->show();

    return app.exec();
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-27 15:35:27

QQuickWidget用于绘画的策略是创建一个屏幕外QQuickWindow,该QQuickWindow将屏幕截图从其中呈现到小部件上。上述限制了grabToImage()的使用,因为此方法要求项目的QQuickWindow是可见的。

解决方案是使用QQuickView + QWidget::createWindowContainer()

代码语言:javascript
复制
#include <QApplication>
#include <QWidget>
#include <QQuickView>

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QApplication app(argc, argv);

    QQuickView *q = new QQuickView;
    q->setResizeMode(QQuickView::SizeRootObjectToView);
    q->setSource(QUrl("main.qml"));

    QWidget * container = QWidget::createWindowContainer(q);
    container->show();

    return app.exec();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59459761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档