我在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图标。
答案 0 :(得分:1)
这可能是我在此处公开的最愚蠢的错误:如果我将setIconSize(QSize(w, h));
放在每个attempt...
等方法的末尾,它们都可以正常工作。
尽管错误是愚蠢的,但我将在此处留下答案,以作为我们可以使用多少种方式渲染SVG的参考。
更新:还有另一种方法可以直接将How to render a scaled SVG to a QImage?提到的QImage
渲染SVG到我的目的。无需中间像素图。