首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QQuickWidget抓取图片

QQuickWidget抓取图片
EN

Stack Overflow用户
提问于 2015-07-14 17:27:10
回答 2查看 1K关注 0票数 2

我正在保存一个带有几个QML子对象的QQuickWidget的图像,但我所拥有的只是一个空白图像。

C++端:

代码语言:javascript
复制
QQuickWidget* content..
content->setSource(QUrl("qml:/main.qml"));
QPixmap *pm = content->grab(QRect(QPoint(0,0),QSize(-1,-1));
pm->save("someFilename.png", 0, 100);

QML端:

代码语言:javascript
复制
Rectangle{  width: 5; height: 5; color: "yellow"; objectname: "rootobj"}

在QML中,我希望动态添加子对象,并能够在图像中显示它们。我尝试过连接到插槽的QQuickWindow grabWindow方法,它可以工作,但它只捕获窗口可见区域,我需要捕获整个QML。

我相信这不是火箭科学,只是我不能在某个地方得到它。感谢您的回复!

附录:

好吧,我不认为这是渲染前/渲染后的问题,因为在我调用图片采集器之前,我可以看到所有的qml子代。很抱歉我说得不够准确。

c++端:

代码语言:javascript
复制
QQuickWidget* content..
content->setSource(QUrl("qml:/main.qml"));
//do all my dynamic qml children adding

在我可以直观地看到我所有的qml之后:

代码语言:javascript
复制
QPixmap *pm = content->grab(QRect(QPoint(0,0),QSize(-1,-1));
pm->save(....

除非我错了,否则我不认为它的渲染问题。谢谢!

EN

回答 2

Stack Overflow用户

发布于 2015-07-14 23:52:45

问题就像米多说的那样。你可以像下面这样解决这个问题。

创建一个类Viewer

viewer.h

代码语言:javascript
复制
class Viewer : public QQuickView{
    Q_OBJECT
public:
    explicit Viewer(QWindow *parent = 0);
    Viewer(bool showBar);
    virtual ~Viewer();
    void setMainQmlFile(const QString file);
    void addImportPath(const QString path);

public slots:
    void beforeRendering();
    void afterRendering()
}

Viewer.cpp

代码语言:javascript
复制
#include "viewer.h"

Viewer::Viewer(QWindow *parent)
    : QQuickView(parent)
{
    setWidth(800);
    setHeight(480);
    connect(this, SIGNAL(beforeRendering()), this, SLOT(beforeRendering()));
    connect(this, SIGNAL(afterRendering()), this, SLOT(afterRendering()));
}

void Viewer::setMainQmlFile(const QString file)
{
    setSource(QUrl::fromLocalFile(file));
}

void Viewer::addImportPath(const QString path)
{
    engine()->addImportPath(path);
}
void Viewer::beforeRendering()
{
//
}

void Viewer::afterRendering()
{
//grab window
  QImage img = this->grabWindow();
    img.save(path);
//or your code
}

main.cpp

代码语言:javascript
复制
Viewer *viewer = new Viewer;
//
///
//
viewer->setMainQmlFile(QStringLiteral("qml/main.qml"));
viewer->show();
票数 3
EN

Stack Overflow用户

发布于 2015-07-14 18:53:40

我认为您的问题是捕获屏幕是在呈现QML对象之前完成的。为了让它工作,你应该在渲染信号之后连接信号的抓取:

代码语言:javascript
复制
 connect(this, SIGNAL(beforeRendering()), this, SLOT(sltBeforeRendering()));
 connect(this, SIGNAL(afterRendering()), this, SLOT(sltAfterRendering()));

sltAfterRendering插槽中执行抓取。

为了抓取屏幕,我使用grabWindow()函数,并从QML中调用它。这取决于你想从你的软件中获得什么样的行为。

试试这个:

grabber.h

代码语言:javascript
复制
#ifndef GRABBER_H
#define GRABBER_H

#include <QObject>
#include <QImage>
#include <QQuickView>

class Grabber : public QObject
{
    Q_OBJECT
public:
     explicit Grabber(QObject *parent = 0);
     Grabber(QQuickView *view);
     ~Grabber();
     Q_INVOKABLE void capture(QString const &path) const;
signals:

public slots:
private:
   QQuickView*  view_;

};

#endif // GRABBER_H

grabber.cpp

代码语言:javascript
复制
#include "grabber.h"

Grabber::Grabber(QObject *parent) :
    QObject(parent)
{
}
Grabber::Grabber(QQuickView* view) :
    view_(view)
{
}
Grabber::~Grabber()
{
    if(view_ != NULL)
    {
        delete view_;
        view_ = NULL;
    }
}
void Grabber::capture(QString const &path) const
{
    QImage img = view_->grabWindow();
    img.save(path);
}

main.cpp

代码语言:javascript
复制
#include <QtGui/QGuiApplication>
#include "qtquick2applicationviewer.h"
#include <QQmlContext>
#include <QQmlEngine>
#include "grabber.h"

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QtQuick2ApplicationViewer *viewer = new QtQuick2ApplicationViewer;
    Grabber * grab = new Grabber(viewer);
    viewer->setHeight(480);
    viewer->setWidth(800);

    viewer->rootContext()->setContextProperty("grab", grab);
    viewer->setMainQmlFile(QStringLiteral("qml/main.qml"));

    viewer->showExpanded();


    return app.exec();
}

使用以下命令从QML调用它:

代码语言:javascript
复制
grab.capture(path + "imageName.png")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31402752

复制
相关文章

相似问题

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