我有一个在 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 端从未收到信号。
它适用于您的 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();
}
}