C++ 重写QQuickImageProvider requestImage()
我正在使用QQuickImageProvider,并在requestimage函数中获取了一个类对象(PageBuffer):C++ 重写QQuickImageProvider requestImage(),c++,qml,qqmlapplicationengine,C++,Qml,Qqmlapplicationengine,我正在使用QQuickImageProvider,并在requestimage函数中获取了一个类对象(PageBuffer): class ImageProvider : public QQuickImageProvider{ public: explicit ImageProvider(); virtual QImage requestImage(int id, QSize *size, const QSize& requestedSize,PageBuffer p); ~ImageP
class ImageProvider : public QQuickImageProvider{
public:
explicit ImageProvider();
virtual QImage requestImage(int id, QSize *size, const QSize& requestedSize,PageBuffer p);
~ImageProvider();
};
我想使用保存在PageBuffer对象中的变量设置ImageProvider的QImage,并使用id作为索引
大概是这样的:
QImage ImageProvider:: requestImage(int id, QSize *size, const QSize &requestedSize,PageBuffer p) {
return p.imagelist[id];
}
这是我的QML文件,我想在其中调用图像提供程序:
Image{
x: 4
y: 4
height : imagerec.height
visible: true
width : imagerec.width
anchors.fill: imagerec
source:fileUrl
Text{
id:txt
x: 0
y: 71
text:"Sketch"+(index+1)
horizontalAlignment: txt.AlignHCenter
font.family: "Tahoma"
color:"#ffffff"
}
MouseArea {
anchors.rightMargin: -59
anchors.bottomMargin: -39
anchors.fill: parent
onClicked: {
p.index=index;
p.image=mod.get(index).fileUrl
main.source="image://image/"+index
}
}
}
好的,伙计们,你们可以从Qt的例子开始。 下面的代码还演示了如何使用图像提供程序从Internet加载随机图像,尽管我认为这非常简单 myimageprovider.h
class MyImageProvider : public QQuickImageProvider
{
public:
MyImageProvider(ImageType type, Flags flags = 0);
~MyImageProvider();
QImage requestImage(const QString & id, QSize * size, const QSize & requestedSize);
protected:
QNetworkAccessManager *manager;
};
myimageprovider.cpp
MyImageProvider::MyImageProvider(ImageType type, Flags flags) :
QQuickImageProvider(type,flags)
{
manager = new QNetworkAccessManager;
}
MyImageProvider::~MyImageProvider()
{
delete manager;
}
QImage MyImageProvider::requestImage(const QString &id, QSize *size, const QSize &requestedSize)
{
QUrl url("http://lorempixel.com/" + id);
QNetworkReply* reply = manager->get(QNetworkRequest(url));
QEventLoop eventLoop;
QObject::connect(reply, SIGNAL(finished()), &eventLoop, SLOT(quit()));
eventLoop.exec();
if (reply->error() != QNetworkReply::NoError)
return QImage();
QImage image = QImage::fromData(reply->readAll());
size->setWidth(image.width());
size->setHeight(image.height());
return image;
}
在main.cpp中注册我们的图像提供商:
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
MyImageProvider *imageProvider = new MyImageProvider(QQmlImageProviderBase::Image);
engine.addImageProvider("myprovider",imageProvider);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
return app.exec();
}
最后,在QML中使用提供程序:
Window {
visible: true
width: 800
height: 600
Image {
id: img
anchors.centerIn: parent
source: "image://myprovider/500/500/"
onStatusChanged: {
if(status == Image.Ready)
indicator.running = false;
}
BusyIndicator {
id: indicator
anchors.centerIn: parent
running: false
}
MouseArea {
anchors.fill: parent
onClicked: {
indicator.running = true;
img.source = "image://myprovider/500/500/?seed=" + Math.random(1000)
}
}
}
}
好的,伙计们,你们可以从Qt的例子开始。 下面的代码还演示了如何使用图像提供程序从Internet加载随机图像,尽管我认为这非常简单 myimageprovider.h
class MyImageProvider : public QQuickImageProvider
{
public:
MyImageProvider(ImageType type, Flags flags = 0);
~MyImageProvider();
QImage requestImage(const QString & id, QSize * size, const QSize & requestedSize);
protected:
QNetworkAccessManager *manager;
};
myimageprovider.cpp
MyImageProvider::MyImageProvider(ImageType type, Flags flags) :
QQuickImageProvider(type,flags)
{
manager = new QNetworkAccessManager;
}
MyImageProvider::~MyImageProvider()
{
delete manager;
}
QImage MyImageProvider::requestImage(const QString &id, QSize *size, const QSize &requestedSize)
{
QUrl url("http://lorempixel.com/" + id);
QNetworkReply* reply = manager->get(QNetworkRequest(url));
QEventLoop eventLoop;
QObject::connect(reply, SIGNAL(finished()), &eventLoop, SLOT(quit()));
eventLoop.exec();
if (reply->error() != QNetworkReply::NoError)
return QImage();
QImage image = QImage::fromData(reply->readAll());
size->setWidth(image.width());
size->setHeight(image.height());
return image;
}
在main.cpp中注册我们的图像提供商:
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
MyImageProvider *imageProvider = new MyImageProvider(QQmlImageProviderBase::Image);
engine.addImageProvider("myprovider",imageProvider);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
return app.exec();
}
最后,在QML中使用提供程序:
Window {
visible: true
width: 800
height: 600
Image {
id: img
anchors.centerIn: parent
source: "image://myprovider/500/500/"
onStatusChanged: {
if(status == Image.Ready)
indicator.running = false;
}
BusyIndicator {
id: indicator
anchors.centerIn: parent
running: false
}
MouseArea {
anchors.fill: parent
onClicked: {
indicator.running = true;
img.source = "image://myprovider/500/500/?seed=" + Math.random(1000)
}
}
}
}
那么你的问题是什么?我的问题是我应该如何使它工作,因为它不是这样工作的。首先,你提供了不完整的代码,所以不可能测试它。如我所见,您没有注册图像提供商。看看怎么做。好的,但是你能告诉我关于requestImage函数我的代码是否很好吗?我也使用了AddImageProvider,但它不工作,它给出了未解决的外部符号错误。那么你的问题是什么?我的问题是我应该如何使它工作,因为它不是这样工作的,首先你提供了不完整的代码,所以不可能测试它。如我所见,您没有注册图像提供商。看看怎么做。好的,但是你能告诉我关于requestImage函数的代码是否正确吗?我也使用了AddImageProvider,但它不起作用,它给出未解析的外部符号错误如果我在QML中有一个上下文属性对象,并且我需要将其Qimage变量发送给图像提供程序,我应该如何做?请回答此链接:如果我在QML中有一个上下文属性对象,并且我需要将其Qimage变量发送给图像提供程序,我应该如何做?请回答此链接: