QquickimageProvider :: requestImage图像缩放,如何处理
QQuickImageProvider::requestImage image scaling, how to handle it
我正在尝试实现一个简单的pximageProvider。源图像是静态的,我只提供一个图像。似乎要求的尺寸总是空的。即使我尝试修改QML侧的图像大小,图像也会重新刻度,但是看起来我的pximageProvider看起来并不像在进行重新缩放...这是正常的吗?
我所做的是实现我的pximageProvider子类,以便当请求时是空的(宽度或高度为空或负数(,我提供了翻转的原始图像(所以我知道我没有进行任何重新缩放(。但是,即使QML侧试图重新列出图像,我也总是看到我的图像翻转(已重新销毁但翻转(。
我的.h头:
#include <QQmlApplicationEngine>
#include <QQuickImageProvider>
#include <QImage>
class MyImageProvider :
public QQuickImageProvider
{
public:
MyImageProvider(QQmlApplicationEngine *engine, const QString &qmlId, const QImage *image = Q_NULLPTR);
QImage requestImage(const QString &id, QSize *size, const QSize &requestedSize) override;
void setImage(const QImage &image);
private:
QImage _image;
};
和我的.cpp:
#include "myimageprovider.h"
MyImageProvider::MyImageProvider(QQmlApplicationEngine *engine, const QString & qmlId, const QImage *image) :
QQuickImageProvider(QQuickImageProvider::Image)
{
if (image == Q_NULLPTR) {
_image = QImage();
}
else {
_image = *image;
}
engine->addImageProvider(qmlId, this);
}
QImage MyImageProvider::requestImage(const QString &id, QSize *size, const QSize &requestedSize)
{
// Ignoring the id field, just one image to output
*size = _image.size();
if (requestedSize.isEmpty())
return (_image.mirrored(true, true));
else
return (_image.scaled(requestedSize, Qt::KeepAspectRatio));
}
void MyImageProvider::setImage(const QImage &image)
{
_image = image;
}
我创建一个实例,将其馈送为100x100像素图像。在QML侧:
Rectangle {
id: myImageBlock
color: "grey"
width: 250
height: 250
anchors.centerIn: parent
Image {
id: myImage
source: "image://my_image/unusedId"
anchors.centerIn: parent
width: 50
height: 50
}
}
我确实得到了我的图像,在250x250的灰色正方形上正确地缩放到50x50 ...但是图像已翻转,这意味着我的提供商没有缩放图像。这应该如何工作吗?
如文档中所述:
qimage qquickimageProvider :: requestImage(const qString&amp; id,qsize *大小,const qsize&amp; requestSize(
实现此方法以使用ID返回图像。默认实现返回一个空图像。
ID是请求的图像源,带有"图像:"方案和 提供者标识符已删除。例如,如果图像源是 "图片://myprovider/iCons/home",给定的ID将是"图标/家"。
请求的尺寸对应于图像:: sourcesize 图像项。如果要求SYSIZE是有效的大小,则返回图像 应该是那个大小。
在所有情况下,大小都必须设置为图像的原始大小。这 如果这些用于设置相关图像的宽度和高度 值尚未明确设置。
注意:此方法可以通过多个线程调用,因此请确保 该方法的实现是重新进入的。
(强调矿山(
您必须使用Image
的sourceSize
。
Image {
id: myImage
source: "image://my_image/unusedId"
anchors.centerIn: parent
width: 50
height: 50
sourceSize.width: 50 // <---
sourceSize.height: 50 // <---
}
- 警告处理为错误这里有什么问题
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 使用流处理接收到的数据
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 基于多个条件处理地图中的所有元素
- 如何用数字处理log(0)
- SSL上的`curl_easy_send`和`curl_asy_recv`:如何处理`CURLE_AGAIN`
- 错误处理.将系统错误代码映射到泛型
- 从文本文件中读取时钟时间和事件时间并进行处理
- 在运行时处理类型擦除的数据-如何不重新发明轮子
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 用于矢量处理的多个线程
- 对字符串进行排序时,在c++中处理sort()
- 如何处理linux终端中带有负号(-)的C++中的命令行参数
- 处理除以零会导致<csignal>意外行为
- 是否可以在c++中处理字符串流中的各个元素
- 在简单的外壳中进行批处理处理