如何用资源中没有的其他图像替换 QML(Qt)文件上的图像

Posted

技术标签:

【中文标题】如何用资源中没有的其他图像替换 QML(Qt)文件上的图像【英文标题】:How to replace an image on QML (Qt) file by an other image do not have in Resource 【发布时间】:2017-04-26 07:20:49 【问题描述】:

我有一个 Qml 文件,在其中的按钮上设计了一个图像。

Menu.qml

(...)
ToolButton 
  Image 
    (...)
    Image 
      id: img1
      source: "qrc:/Images/img_1.png" 
    
    

现在我想,如果我在文件夹 C:/Images/ 中有一张图片,例如 C:/Pic/img_2.png,加载成功后 Menu.qml ,它会自动将 img_1.png(在资源中)替换为 img_2.png(不在资源中)。

有人可以帮帮我吗? (对不起我的英语不好)

【问题讨论】:

【参考方案1】:

Image 允许用户在运行时使用 javascript 代码更改图像源。因此,无论何时您想更改图像,都可以将新的源 URL 分配给 img1.source

image.source = 'file:/c:/Pic/img_2.png';

请注意,对于本地文件,您应该使用file: 协议方案。

【讨论】:

你测试了吗?我可能是错的,但我很确定它需要三个正斜杠:file:///C:/Pic/img_2.png 非常感谢file:/ 我尝试了一个正斜杠,它仍然有效..【参考方案2】:

如果我理解您的问题,您可以在加载按钮后通过附加到信号 Component.onCompleted 来更改属性

(...)
ToolButton 
  Image 
    (...)
    Image 
      id: img1
      source: "qrc:/Images/img_1.png" 
      Component.onCompleted: 
        source = "file://C:/Pic/img_2.png"
      
    
    

【讨论】:

感谢您的帮助。我的 qml 文件有许多图像,每个图像可以替换(如果文件夹 C 中存在id 的图片),或不(如果不存在)。我的老师想批准一次。所以我选择了这种方式:编写函数浏览该文件夹并列出所有适当的文件名,并替换var pngName = arrayIcon[i]; var controlName = pngName.slice(0,-4); eval(controlName).source = pathPng + pngName;然后加载成功后调用该函数。目前,它仍然运行良好。【参考方案3】:

Managing Resource Files with the Qt Resource System

...QML 中由相对路径指定的所有文件都将从资源系统加载。资源系统的使用对 QML 层完全透明;这意味着所有 QML 代码都应该使用相对路径引用资源文件,并且不应使用 qrc 方案。此方案只能在 C++ 代码中用于引用资源文件。

因此,在资源文件之外加载图像所需要做的就是使用其绝对路径。

【讨论】:

以上是关于如何用资源中没有的其他图像替换 QML(Qt)文件上的图像的主要内容,如果未能解决你的问题,请参考以下文章

如何用颜色填充 box2d-qml 多边形?

QML 中的全局图像资源

更改后,QT QML资源文件不会重新编译

QML 组件“视频”无法播放 Qt 资源文件中的视频文件

如何为 Qt 5.5 + QtQuick 2.5 定义 Qml 组件文件解析器?

如何在 QML 中添加和使用资源?