SVG QIcon 无法返回在 QToolButton 中使用的放大像素图

2024-04-09

我在图标中使用 SVG 图像QToolButtons。但我需要能够更改工具按钮的大小,并且需要放大或缩小图标。我的 SVG 图标的原始大小为 24(像素)。麻烦的是QIcon是它们不会放大到超过原始大小。 (请参阅我的代码中的 attempts0...)

所以我尝试了另一种方法,我覆盖了resizeEvent并使用QToolButton.setIconSize(event.size())效果非常好,它允许无限制地放大和缩小。 (参见我的代码中的尝试1...)

但我的问题来了。我确实需要对渲染的图标进行一些像素级的颜色转换。因此我需要得到QImage我可以从中获得QPixmap. 但问题是我无法将 SVG 图像渲染为大于 SVG 原始大小的像素图。像素图本身更大,但图像仍然很小,与像素图的中心对齐。我尝试了三种不同的方法,但没有一个有效。 (请参阅我的代码中的尝试2...到尝试4...)

我的代码在这里。为了简单起见,我省略了我对获得的像素图/图像所做的颜色像素变换。

工具栏.h

#pragma once

#include <QToolButton>

class ToolButton : public QToolButton
{
    Q_OBJECT
public:
    explicit ToolButton(QWidget *parent = nullptr);
protected:
    void resizeEvent(QResizeEvent *event) override;
private:
    void attempt0_thisDoesNotScaleUp();
    void attempt1_thisScalesWellButIdoNotHavePixmap(int w, int h);
    void attempt2_thisDoesNotScaleUp(int w, int h);
    void attempt3_thisDoesNotScaleUp(int w, int h);
    void attempt4_thisDoesNotScaleUp(int w, int h);
    QString m_iconName;
};

工具栏.cpp

#include "toolbutton.h"

#include <QDebug>
#include <QPainter>
#include <QResizeEvent>
#include <QtSvg/QSvgRenderer>

ToolButton::ToolButton(QWidget *parent) :
    QToolButton(parent)
{
    m_iconName = "icon.svg";
    // attempt0_thisDoesNotScaleUp(); // uncomment to try attempt 0
}

void ToolButton::resizeEvent(QResizeEvent *event)
{

    int w = event->size().width();
    int h = event->size().height();

    //attempt1_thisScalesWellButIdoNotHavePixmap(name, w, h); // uncomment to try attempt 1
    //attempt2_thisDoesNotScaleUp(name, w, h); // uncomment to try attempt 2
    //attempt3_thisDoesNotScaleUp(name, w, h); // uncomment to try attempt 3
    //attempt4_thisDoesNotScaleUp(name, w, h); // uncomment to try attempt 4

    QToolButton::resizeEvent(event);
}

void ToolButton::attempt0_thisDoesNotScaleUp()
{
    setIcon(QIcon(m_iconName));
}

void ToolButton::attempt1_thisScalesWellButIdoNotHavePixmap(int w, int h)
{
    setIcon(QIcon(m_iconName));
    setIconSize(QSize(w, h));
}

void ToolButton::attempt2_thisDoesNotScaleUp(int w, int h)
{
    QIcon source(m_iconName);
    QPixmap pixmap = source.pixmap(w, h);
    QIcon icon;
    icon.addPixmap(pixmap);
    setIcon(icon);
}

void ToolButton::attempt3_thisDoesNotScaleUp(int w, int h)
{
    QSvgRenderer renderer(m_iconName);
    QPixmap pm(w, h);
    QPainter painter(&pm);
    renderer.render(&painter, pm.rect());
    QIcon icon;
    icon.addPixmap(pm);
    setIcon(icon);
}

void ToolButton::attempt4_thisDoesNotScaleUp(int w, int h)
{
    QIcon source(m_iconName);
    QPixmap pm(w, h);
    QPainter painter(&pm);
    source.paint(&painter, pm.rect());
    QIcon icon;
    icon.addPixmap(pm);
    setIcon(icon);
}

main.cpp(将工具按钮显示为主窗口,以便能够测试调整大小)

#include "toolbutton.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    ToolButton w;
    w.show();
    return a.exec();
}

为了进行测试,我使用 www.iconmonstr.com 中的 SVG 图标,其原始大小为 24x24 像素。当然,我需要能够将它们缩放到这个大小之上。

我想我错过了一些明显的东西......因为QToolButton::setIconSize(someBiggerSize);能够放大 SVG 图标。


可能是我在这里公开的最愚蠢的错误:如果我把setIconSize(QSize(w, h));在每个的末尾attempt...等等方法,它们都可以正常工作。

尽管这个错误很愚蠢,但我还是将答案留在这里作为我们可以使用多少种方式来渲染 SVG 的参考。

更新:还有另一种方法可以直接渲染 SVGQImage这里提到如何将缩放后的 SVG 渲染为 QImage? https://stackoverflow.com/questions/8551690/how-to-render-a-scaled-svg-to-a-qimage这实际上似乎最适合我的目的。不需要中间像素图。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SVG QIcon 无法返回在 QToolButton 中使用的放大像素图 的相关文章

  • 如何在 Qt-Embedded 中(正确)输出多语言文本?

    我的目标系统是 linux 3 3 7 Qt Embedded 开源版 4 8 Droid 字体 取自 fonts droid 20111207 git 1 all deb Debian 软件包并复制到 usr lib fonts目录 主要
  • Qt程序部署到多平台,如何?

    我是 Qt 编程新手 我想开发一个程序 我想在 Windows Linux ubuntu 和 Mac 上运行 听说Qt支持多平台应用程序开发 但我的问题是 在我部署或编译后 任何 Qt 库都需要在 Ubuntu 中运行这个应用程序吗 如果您
  • 程序意外完成 - QT Creator

    我正在尝试使用 QT Creator 使用 QT 框架开发 GUI 控制台应用程序 我使用的是Windows XP 我安装了QT 4 8 3和mingw 两者均已安装 没有任何错误 然后我安装了QT Creator QT 版本 路径中的 Q
  • 如何在按下托盘图标菜单操作时执行功能?

    int main int argc char argv QApplication oApp argc argv QAction action1 QMenu menu QSystemTrayIcon TrayIcon QIcon favico
  • 禁用 QML Slider 的鼠标滚轮

    我希望能够滚动Flickable使用鼠标滚轮 或触摸板上的两根手指 不改变Sliders它可能包含 示例代码及结果应用 import QtQuick 2 7 import QtQuick Window 2 2 import QtQuick
  • 如何使用 Qtimer 添加 1 秒延迟

    我目前有一个方法如下 void SomeMethod int a Delay for one sec timer gt start 1000 After one sec SomeOtherFunction a 这个方法实际上是一个附加到信号
  • 向 Qt 样式表添加特异性时丢失样式

    这是我的代码 const QString STYLE SHEET background color rgba x x x y border 1px solid gray border radius 0px border top 1px so
  • 如何创建用于 QML 的通用对象模型?

    我想知道是否有任何宏或方法如何将 Qt 模型注册为 QObject 的属性 例如 我有AnimalModel http doc qt io qt 5 qtquick modelviewsdata cppmodels html qabstra
  • 如何将图像显示为缩略图

    我有一个QTreeView显示硬盘驱动器和目录 我也有一个QListView显示图像文件如下 但我想将图像显示为缩略图 如下所示 My code mainWidget mainWidget QWidget parent QWidget pa
  • 为 Windows 98 编译 Qt

    我需要支持 Windows 98 Qt 文档声称这是可能的 但没有说明 Qt 4 6 的分布式二进制文件不能在 Win98 上运行 而且我采样的大多数 Qt 应用程序也不能在 Win98 上运行 对于几个确实在 98 上运行的应用程序 我询
  • QCombobox 向下箭头图像

    如何更改Qcombobox向下箭头图像 现在我正在使用这个 QSS 代码 但这不起作用 我无法删除向下箭头边框 QComboBox border 0px QComboBox down arrow border 0px background
  • 如何获取 QTableView 的标题列表?

    我有一个QTableView我的对话框中的对象 我需要访问该表的水平标题并将它们放入QStringList object 尽管进行了大量搜索 但我在 Qt 文档中找不到如何获取此标头列表 编辑 我发现的最接近的地方是this https w
  • 退出 Qt 程序的正确方法?

    我应该如何退出 Qt 程序 例如在加载数据文件时 发现文件损坏 并且用户需要退出该应用程序或重新启动数据文件 我是不是该 call exit EXIT FAILURE call QApplication quit call QCoreApp
  • Qt 布局,在小部件大小更改后调整到最小大小

    基本上我有一个QGridLayout里面有一些小部件 最重要的是 2 个标签 我用它们将图像绘制到屏幕上 好吧 如果用户愿意 他可以更改传入图像的分辨率 从而强制标签调整大小 我们假设标签的初始大小是320x240 用户将 VideoMod
  • 即使在可访问性中勾选应用程序,AXIsProcessTrustedWithOptions 也不会返回 true

    As this question https stackoverflow com questions 17693408 enable access for assistive devices programmatically on 10 9
  • Qml 模块未找到 CPP 类注册与新的 QML_ELEMENT r

    我尝试使用 Qt5 15 0 和新宏 QML ELEMENT 在 QML 中注册我的自定义 CPP 类 但找不到该模块 Qt Creater 帮助文件描述了 QML ELEMENT 的步骤 我也检查了 Qt 手册 但没有幸福的结局 http
  • 如何检测QTableView中的双击

    我正在使用 PyQt 创建 GUI 应用程序 在继承自 QTableView 的视图中 需要检测用户双击行时选择的行 该表可以排序 但不能编辑 我该怎么做 注意 尝试了 doubleClicked int 信号 它是由鼠标按钮发出的 而不是
  • QML 连接:不推荐使用连接中隐式定义的 onFoo 属性

    升级到 Qt 5 15 时收到以下错误消息 QML Connections Implicitly defined onFoo properties in Connections are deprecated Use this syntax
  • Qt moc 在头文件中实现?

    是否可以告诉 Qt MOC 我想声明该类并在单个文件中实现它 而不是将它们拆分为 h 和 cpp 文件 如果要在 cpp 文件中声明并实现 QObject 子类 则必须手动包含 moc 文件 例如 文件main cpp struct Sub
  • 如何在 Qt 应用程序中通过终端命令运行分离的应用程序?

    我想使用命令 cd opencv opencv 3 0 0 alpha samples cpp cpp example facedetect lena jpg 在 Qt 应用程序中按钮的 clicked 方法上运行 OpenCV 示例代码

随机推荐

  • 如何在春季结束会话 3

    我在用 SessionAttributes在春天 但我不知道如何结束会话 我尝试了下面的代码 但出现错误 请给我一些例子 Thanks RequestMapping value LogoutAction public String logo
  • 在没有受信任证书的情况下安装 .appx?

    我有一个 Windows 8 应用程序 我想将其部署到我的 Windows RT 2 我只有 appx 我想绕过商店安装它进行测试 但是 当我运行命令时 Add AppxPackage
  • 克隆二叉树的时间复杂度

    我想知道克隆二叉树的代码的时间复杂度是否为 O n 如果是 O n 你能解释一下为什么吗 如果没有 你能建议一种时间复杂度为 O n 的方法吗 public TreeNode cloneTree TreeNode root if root
  • 需要查看sql中的一个日期范围是否与另一个日期范围重叠

    我有一个存储房间预订的表 其架构是 ID ROOM ID CHECK IN DATE CHECK OUT DATE USER ID 我需要对一组日期范围内可用 不可用的房间运行搜索查询 另请记住 还有另一个表保存预订房间的日期 其格式如下
  • Angular 5 的子路由无法正常工作

    您好 我正在尝试使用子路由 但它无法按预期工作 我的 Angular 5 结构 在这种情况下 顶部导航包含加载子模块的链接 子导航包含更新子模块内容的链接 应用程序模块 和应用程序组件 包含一个顶部导航栏 用于导航到不同的子模块 应用程序组
  • 根据任何列值从数据框中删除行[重复]

    这个问题在这里已经有答案了 我有一个这样的数据框 Plate MeanV1 MeanV2 MeanV3 etc 0 1 3 2 4 8 6 8 1 1 3 1 10000 10000 2 2 2 8 4 6 6 1 3 2 2 9 5 1
  • 删除使用闭包语法按名称创建的通知中心观察者是否足够?

    我有一些使用块 尾随闭包语法创建的通知 如下所示 NotificationCenter default addObserver forName NSManagedObjectContextObjectsDidChange object mo
  • RESTful:在一个请求中创建多条记录

    我有一个允许用户向其他人发送邀请的表单 邀请的数量可由用户在用户界面中配置 并且理论上可以是无限的 用户需要为每个邀请定义一个电子邮件地址 单击 发送 时 理想情况下应该向服务器发送一个请求 将所有记录包装在一次批量提交中 尽管这并不是真正
  • Nhibernate - 找不到属性的 getter

    我正在尝试构建 MusicStore Nhibernate 端口 但遇到了此错误 无法在类中找到属性 OrderInfo 的 getter MvcMusicStore Models OrderDetail 但有以下内部异常 NHiberna
  • 对于某些 Windows 命令,nodejs exec 命令失败,并且没有明确的错误消息

    我的程序中有一个编辑器 可以动态编写命令并执行它们 我想通过 child process exec 将 myPublish 目录中的所有文件和文件夹移动到当前目录 我在 Windows 中使用 robocopy 命令 当我在 cmd 中测试
  • 什么是 Azure 的 Microsoft.Insights 资源提供程序?

    我刚刚开始使用 Azure 发现我没有获得任何存储和其他资源的指标 因为我没有microsoft insights资源提供者作为我订阅的一部分 我注册了我的订阅microsoft insights我得到了我想要的所有数据 但我想知道注册的含
  • 收藏的意义何在

    我一直在阅读Effective Java 并且遇到了无界集合类型当我们只能插入null元素 因为它看起来毫无意义 我一直在试图弄清楚这个概念 但它似乎没有多大意义 任何帮助将非常感激 Collection collection Object
  • Sql*plus 总是返回退出代码 0?

    每当我使用 Sql plus 运行 sql 脚本并检查 时 即使脚本不成功 我也会得到 0 Example sqlplus user password instance script sql SQL Plus Release 10 2 0
  • 在今天和昨天之间选择

    我正在尝试在两个日期之间进行选择 如下所示 SELECT p Code p Name sum h PA 1 AS PA sum h PB 1 AS PB sum h PG 1 AS PG sum h GoedkeuringDoorNew G
  • golang - 切片中指针的内容在递归函数运行期间发生变化

    func getAllCertainDivs className string idName string htmlTag HtmlTag matchingDivs HtmlTag fmt Println htmlTag Class if
  • Actionscript 3 的面向方面编程库/框架?

    我正在寻找 Actionscript 3 的全功能 AOP 库 到目前为止我注意到以下项目 但它们似乎都有问题 http farmcode org page Sodality aspx http farmcode org page Soda
  • Elasticsearch 中累积基数聚合的替代解决方案

    我正在运行一个无法访问的 Elasticsearch 集群x packs在 AWS 上 但我仍然想做一个cumulative cardinality aggregation https www elastic co guide en ela
  • ASP.NET Identity - 如何将 dbo.AspNetUsers.Id 更改为非聚集索引?

    我正在使用 ASPNET Identity 2 0 并且需要 添加一个名为 ApplicationUserId int 聚集索引的新字段 将 dbo AspNetUsers Id nvarchar 字段从聚集索引更改为非聚集索引 在我的 M
  • .net Core Quartz 依赖注入

    我如何配置 Quartz net核心使用依赖注入 我使用标准的 net core依赖机制 在实现类的构造函数中IJob 我需要注入一些依赖项 您可以使用Quartz Spi IJobFactory接口并实现它 Quartz 文档指出 当触发
  • SVG QIcon 无法返回在 QToolButton 中使用的放大像素图

    我在图标中使用 SVG 图像QToolButtons 但我需要能够更改工具按钮的大小 并且需要放大或缩小图标 我的 SVG 图标的原始大小为 24 像素 麻烦的是QIcon是它们不会放大到超过原始大小 请参阅我的代码中的 attempts0