如何在另一个类的QQuickImageProvider类中设置QPixmap?

时间:2016-08-07 02:19:01

标签: c++ qt qml

我正在使用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);

0 个答案:

没有答案