更改按钮图标 SVG 颜色

Posted

技术标签:

【中文标题】更改按钮图标 SVG 颜色【英文标题】:Change Button Icon SVG Color 【发布时间】:2021-06-21 15:50:24 【问题描述】:

我有几个问题。我正在尝试创建一个自定义按钮,该按钮显示一个图标供用户单击。源图像是 svg。

    虽然我已经看到自定义按钮最常见的方法是使用 ColorOverlay,但我无法做到这一点,因为根据 link,QtGraphicalEffects 似乎不是 Qt6 的一部分,因此我无法使用颜色叠加。我正在使用 Python 和 Pyside6 构建我的应用程序。

    我也尝试使用 Button.qml 组件来实例化一个按钮,但我无法获得正确的搜索路径,因为它会从与 Button.qml 相同的目录中查找我的源图标图像,我确实这样做了不知道如何改变它的搜索目录。

    理想情况下,我希望能够使用 qrc 文件加载源图像,但我还没有找到在 QML 而不是 Python 中使用加载到 qrc 文件中的图像的方法。

这是我的代码中的一个 sn-p,其中包含我尝试制作的自定义按钮:

Rectangle
     width: 25
     height: 25
     color: "#00000000"
     Image
        width: 24
        height: 24
        source: "random.svg"
      

      MouseArea

      

 

带有QT的Button组件的Button:

Button
    width: 25
    height: 25
    display: AbstractButton.IconOnly
    icon.source: "random.svg"

【问题讨论】:

【参考方案1】:

对于问题 1

Qt6.1 包含 QtGraphicalEffects。

问题二

假设项目结构是这样的

-- project
  -- main.qml
  -- customs
     -- Button.qml
     -- icons
         -- random.svg

在你的 main.qml 中导入一个命名空间下的 Button.qml。假设是 Cust(它必须以大写字母开头)。

// main.qml
import QtQuick 2.15
import QtQuick.Controls 2.15
import "./customs" as Cust

Cust.Button 

这一次你 100% 确定,你的会被加载。现在在您的自定义 Button.qml 中添加源,您说它是相对于它的

// Button.qml
Rectangle 
    ...
    source: "./icons/random.svg"

如果自定义 Button.qml 代码本身与 main.qml 无关,例如 Button.qml 与 main.qml 不在同一文件夹中。您应该将该文件夹添加到 QML2_IMPORT_PATH 环境变量以便能够导入它

例如。 /path/to/customs

您还需要该文件夹中的 qmldir 文件才能使其工作

// qmldir
module myCustomModule
Buttom 1.0 Button.qml

-- customs
   -- qmldir
   -- Button.qml

然后就可以在main.qml中导入为

// main.qml
import QtQuick 2.15
import QtQuick.Controls 2.15
import myCustomModule as Cust

Cust.Button 

如果你没有把你的也叫做 Button.qml 而你把它叫做 MyButton.qml,你可以这样做

// main.qml
import myCustomModule

MyButton 

这意味着你还必须在你的 qmldir 中声明 MyButton

问题 3

您可以在 QML 文件中使用 qrc 作为

source: "qrc:///random.svg"

这是严格的,而在 python 中你也可以这样做:

":/random.svg"

【讨论】:

嗨。所以解决你的第二个答案,我的 Button.qml 文件与图标文件夹位于同一目录中,但如果不是因为我的搜索路径完全关闭,我改变你的路径并不是什么大问题.我在一个虚拟环境中运行,所以显然程序正在进入安装在 Qt 的 Button.qml 所在的 QtQuick 包中,并在那里搜索图像。您的其他答案工作正常;这只是为了快速测试,如果可能的话,我希望选项 2 可用。

以上是关于更改按钮图标 SVG 颜色的主要内容,如果未能解决你的问题,请参考以下文章

如何使 .svg 图标对禁用状态做出反应并更改其颜色?

使用浮动操作按钮更改图标颜色

悬停时更改按钮内的字体图标颜色

悬停时可折叠图标/内容颜色更改

在菜单组件中鼠标悬停时更改按钮的图标和文本颜色

如何在反应、样式化的组件中使用字体真棒图标更改单选按钮的颜色