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

时间:2018-10-10 10:42:53

标签: qt

我在QToolButton的图标中使用了SVG图片。但是我需要能够更改工具按钮的大小,并且需要使图标放大或缩小。我的SVG图标的原始大小为24(像素)。 QIcon的问题在于它们无法扩展到原始大小以上。 (请参见我的代码中的try0 ...)

因此,我尝试了另一种方法,我重写了resizeEvent并使用了QToolButton.setIconSize(event.size()),它可以完美地工作,它可以无限制地进行缩放。 (请参阅我的代码中的try1 ...)

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

我的代码在这里。为简单起见,我省略了对获得的像素图/图像执行的逐像素彩色变换。

toolbar.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;
};

toolbar.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图标。

1 个答案:

答案 0 :(得分:1)

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

尽管错误是愚蠢的,但我将在此处留下答案,以作为我们可以使用多少种方式渲染SVG的参考。

更新:还有另一种方法可以直接将How to render a scaled SVG to a QImage?提到的QImage渲染SVG到我的目的。无需中间像素图。