QML ImageProvider 在 Raspberry 上不显示任何内容

问题描述 投票:0回答:1

我有一个在 Windows 上运行良好的 Qt/QML 项目。最近,我添加了一个在 QML 中显示一些图像的选项。由于我需要从 C++ 设置它们,因此我使用 ImageProvider 来实现。它在 Windows 上运行良好,但是当我在 Raspberry Pi(Buster、Qt 5.12.4)上编译该项目时,它不显示任何内容。

我尝试在某些地方插入一些日志记录,结果发现

requestImage
永远不会被调用。

以下是提供者的样子:

class ImageProvider : public QQuickImageProvider {
    QImage image;
public:
    ImageProvider()
        : QQuickImageProvider(QQuickImageProvider::Image) {}

    void setImage(QImage img) {
        image = img;
    }

    QImage requestImage(const QString& id, QSize* /*size*/, const QSize& /*requestedSize*/) override {
        qInfo() << "Getting image from ImageProvider: " << id;
        return image;
    }
};

在 QML 中,它的使用方式如下:

Image {
    id: customImage
    source: ""
    anchors.fill : parent
    fillMode: Image.PreserveAspectFit

    Timer {
        id: refreshTimer
        interval: 20
        running: false
        repeat: false
        onTriggered: parent.source = "image://images/imageContent"
    }

    function refresh() {
        source = "";
        /* If an image is already displayed, it won't refresh
           if I set source to empty string and then right away 
           to an image provider again, it won't notice. It has to
           tick in the meantime... This is a workaround, maybe there's
           a better solution*/
        refreshTimer.start();
    }
    Connections {
        target: rootItem
        function onImageRefresh() {
            customImage.refresh();
        }
    }
}

我确实注册了图像提供程序,但从它在 Windows 上运行的事实来看,这一点应该很清楚:

engine.addImageProvider(QLatin1String("images"), new ImageProvider());

如您所见,我正在使用一种解决方法,以便能够在图像更改时刷新图像,但这很可能不是问题,因为它同样适用于 Windows。问题是该函数根本不会在 Raspberry Pi 上被调用。

rootItem
是上下文,以便我可以从 C++ 后端类发出信号。设置是这样的:

engine.rootContext()->setContextProperty("rootItem", (QObject*)this);

其中

this
是具有此信号的类的实例:

signals:
    void imageRefresh();

我从 C++ 发出信号,如下所示:

emit view.imageRefresh();

但显然 QML 端从未收到信号。

c++ qt raspberry-pi qml raspbian-buster
1个回答
0
投票

它适用于您的 Windows 版本但不适用于您的 rPi 的原因是您在 Windows 上使用 Qt 5.15,但在 rPi 上使用 5.12。 Connections 块中的代码仅适用于 5.15。由于某种原因,Qt 在 5.15 中进行了语法更改,破坏了向后兼容性。较旧的语法应该适用于两者,但我相信 5.15 仍然会向您发出有关它的警告。

因此,要使用较旧的 5.12 语法修复代码,请将 Connections 对象更改为如下所示:

    Connections {
        target: rootItem
        onImageRefresh: {
            customImage.refresh();
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.