gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:53:50 30 4
gpt4 key购买 nike

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

所以我尝试了另一种方法,我重写了 resizeEvent 并使用了 QToolButton.setIconSize(event.size()) 效果很好,它允许无限制地放大和缩小. (请参阅我的代码中的 attempt1...)

但是我的问题来了。我确实需要对我渲染的图标进行一些像素级的颜色转换。因此,我需要获取 QImage,我可以从 QPixmap 获取它。 但问题是我无法将 SVG 图像呈现为比 SVG native 大小更大的像素图。像素图本身更大,但图像仍然很小,与像素图的中心对齐。我尝试了三种不同的方法,但都没有奏效。 (请参阅我的代码中的 attempt2... to attempt4...)

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

工具栏.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 图标。

最佳答案

可能是我在 SO 上公开的最愚蠢的错误:如果我将 setIconSize(QSize(w, h)); 放在每次 attempt... 的末尾code> 等方法,它们都可以正常工作。

尽管这个错误很愚蠢,但我会在这里留下答案,作为我们可以使用多少种方法来渲染 SVG 的引用。

更新:还有另一种将 SVG 直接渲染到此处提到的 QImage 的方法 How to render a scaled SVG to a QImage?这个实际上似乎最适合我的目的。无需中间像素图。

关于qt - SVG QIcon 无法返回在 QToolButton 中使用的放大像素图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52738410/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com