我正在尝试使用 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"
}
}
在我的登录类中保存图像,例如,
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");
}
我在 C++ 类中获得了正确的图像宽度和高度,但问题是我找不到保存图像项目的方法QQuickItem
.
现在,我通过抓取窗口来保存图像,这实际上并没有给出输出文件上的实际图像大小,而是给出具有当前 qml 窗口大小的输出文件。
基本上我在这里遵循代码保存 QML 图像 https://stackoverflow.com/questions/11011391/saving-qml-image但看来QDeclarativeItem
在Qt5中已弃用,所以我选择QQuickItem
因为没有油漆选项QQuickItem
.
幸运的是QQuickItem
有一个方便的抓取图像 http://doc.qt.io/qt-5/qquickitem.html#grabToImage执行此操作的函数。
void Login::save( QQuickItem *item)
{
QSharedPointer<const QQuickItemGrabResult> 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
});
}
不使用 lambda 的替代解决方案:
void Login::save( QQuickItem *item)
{
QSharedPointer<const QQuickItemGrabResult> 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<const QQuickItemGrabResult*>(sender());
if (grabResult) {
grabResult->saveToFile("C:/Users/haris/Desktop/output.png");
} else {
//something went wrong
}
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)