将QML图像保存在c ++中

Har*_*ris 4 c++ qt qml

我正在尝试使用qml显示网络图像,然后使用c ++代码保存此图像,

这是qml代码,

import QtQuick 2.3
import QtQuick.Window 2.2
import com.login 1.0
Window {
    visible: true
    width : 500
    height: 500

     Login{id: login}

    MouseArea {
        anchors.fill: parent
        onClicked: {
          //  Qt.quit();
            login.save(image);
        }
    }



    Image {
        id: image
        source: "http://www.test.com/webp/gallery/4.jpg"
    }


}
Run Code Online (Sandbox Code Playgroud)

在我的登录类里面保存图片,比如

void Login::save( QQuickItem *item)
{
    qDebug()<<"width: "<<item->width();
    qDebug()<<"height: "<<item->height();

    QQuickWindow *window = item->window();
    QImage image = window->grabWindow();

    QPixmap pix = QPixmap::fromImage(image);
    pix.save("C:/Users/haris/Desktop/output.png");
}
Run Code Online (Sandbox Code Playgroud)

我在c ++类中获得了正确的图像宽度和高度,但问题是我无法找到保存图像项的方法QQuickItem.

现在我通过抓取窗口来保存图像,实际上没有在输出文件上给出实际图像大小,而是给出具有当前qml窗口大小的输出文件.

基本上我遵循这里保存QML图像的代码,但它似乎QDeclarativeItem在Qt5中被弃用,所以我选择QQuickItem在哪里没有绘画选项QQuickItem.

coy*_*508 7

幸运的是QQuickItem有一个方便的grabToImage功能.

void Login::save( QQuickItem *item)
{
    auto grabResult = item->grabToImage();

    connect(grabResult.data(), &QQuickItemGrabResult::ready, [=]() {
        grabResult->saveToFile("C:/Users/haris/Desktop/output.png");
        //grabResult->image() gives the QImage associated if you want to use it directly in the program
    });
}
Run Code Online (Sandbox Code Playgroud)

不使用lambdas的替代解决方案:

void Login::save( QQuickItem *item)
{
    auto grabResult = item->grabToImage();

    /* Need to store grabResult somewhere persistent to avoid the SharedPointer mechanism from deleting it */
    ...

    connect(grabResult.data(), SIGNAL(ready()), this, SLOT(onAsynchroneousImageLoaded()));
}

void Login::onAsynchroneousImageLoaded() {
    auto grabResult = qobject_cast<QQuickItemGrabResult*>(sender());
    if (grabResult) {
        grabResult->saveToFile("C:/Users/haris/Desktop/output.png");
    } else {
        //something went wrong
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,我用代码编辑了答案,该代码使用lambda函数来处理信号. (2认同)
  • 完成.不要忘记确保你的项目启用了c ++(CONFIG + = c ++ 11) (2认同)