我正在使用QML和C ++开发一个应用程序,目标是从HTTP服务器下载一个名为“test.jpg”的图像,并将其显示在QML图像组件中,而不会将其保存在硬盘中磁盘驱动器。
类“AppController”从服务器下载图像“test.jpg”并存储在名为“imageReadFromServer”的全局QPixmap变量中。
#ifndef APPCONTROLLER_H
#define APPCONTROLLER_H
#include <QObject>
class AppController : public QObject
{
Q_OBJECT
public:
AppController(QObject *parent = 0);
Q_INVOKABLE void sendImage(QString _imagePath, QString serverLocation);
Q_INVOKABLE void readImage(QString serverLocation);
private:
QByteArray serverResponse;
QPixmap imageReadFromServer;
};
#endif // APPCONTROLLER_H
要在QML图像组件上显示图像我知道有必要使用“QQuickImageProvider”类,我已经完成了一个名为“ImageProvider”的类并重新实现了它的虚拟方法 QPixmap requestPixmap()来处理QML请求图像显示的时间。为了测试一切是否一直运行到现在,我使用Qt文档提供的下一个示例代码返回一个填充蓝色的QPixmap:
QPixmap ImageProvider::requestPixmap(const QString &id, QSize *size, const QSize &requestedSize)
{
qDebug() << "pixmap requested";
int width = 160;
int height = 100;
if(size)
*size = QSize(width,height);
QPixmap pixmap(requestedSize.width() > 0 ? requestedSize.width() : width,
requestedSize.height() > 0 ? requestedSize.height() : height);
pixmap.fill(QColor("blue").rgba());
//return pixmap;
return pixmap;
}
在 main.cpp 中,我添加了各自的图像提供程序。
engine.addImageProvider(QLatin1String("imagefromserver"), new ImageProvider);
在QML上点击下载按钮时,它会成功调用 ImageProvider 类方法:
onClicked: {
imageVisualizer.visible = true
imageVisualizer.source = "image://imagefromserver/"
}
我需要的是:
当调用 ImageProvider 类的 requestPixmap()方法时,它应返回已存储在 AppController <中的全局变量 imageReadFromServer / strong> class。
我试图让 AppController 类直接从QQuickImageProvider继承但是它不起作用,因为 imageReaderFromServer 值在调用 requestPixmap()之前被奇怪地清除了/强>
我认为我可以使用SIGNALS和SLOTS在类之间传递QPixmap,但QQuickImageProvider不会从QObject继承,所以我不能使用它们。
我感谢任何建议。 感谢。
我再次尝试在AppController
类中实现QQuickImageProvider继承。它已经工作了,错误出现在main.cpp
文件中,我正在声明图像提供程序,如下所示:
AppController applicationController;
QQmlApplicationEngine engine;
engine.addImageProvider(QLatin1String("imagefromserver"), new AppController);
这创建了一个AppController类的新实例,当我访问requestPixmap()
函数时,它无法获取全局QPixmap变量imageReadFromServer
,因为它是在名为applicationController
的实例中创建的。解决方案是将相同的实例分配给imageProvider,如下所示:
engine.addImageProvider(QLatin1String("imagefromserver"), &applicationController);