我是QT的新手,请原谅我的无知。

我正在尝试使用QSizePolicy :: Preferred为水平和垂直创建一个'svg图像按钮'。 那部分有效。调整窗口大小时,按钮会按照我想要的方式增长和缩小...但按钮内的图像保持相同的大小。 我想用按钮缩放图像。我试图重载resizeEvent,并调用setImageSize,但是无限递归。

#ifndef SVGPUSHBUTTON_H
#define SVGPUSHBUTTON_H

#include <QtGui>

class SVGPushButton : public QPushButton
{
public:
    SVGPushButton(QString path, QString name = "");
    ~SVGPushButton();

    void resizeEvent(QResizeEvent * event);
private:
};

#endif // SVGPUSHBUTTON_H

#include "SVGPushButton.h"

SVGPushButton::SVGPushButton(QString svgPath, QString name)
: QPushButton(name)
{
    QIcon icon(svgPath);
    setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Preferred );
    setFlat(true);
    setIcon(icon);
}

SVGPushButton::~SVGPushButton()
{}

void SVGPushButton::resizeEvent(QResizeEvent * event)
{
    setIconSize( event->size() );
}
有帮助吗?

解决方案

这就是我最终解决它的方式:

SVGPushButton::SVGPushButton(QString svgPath, QString name)
: QPushButton()
{
    setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Preferred );
    QSvgWidget *icon = new QSvgWidget(svgPath,this);
    setLayout( new QHBoxLayout(this) );
    layout()->addWidget( icon );
}

其他提示

避免无限递归很容易。将一个布尔数据成员添加到SVGPushButton,表示您在resize事件中,并在您输入事件时检查它:

void SVGPushButton::resizeEvent (QResizeEvent * event)
{
    if (m_insideResize)
        return;
    m_insideResize = true;
    // call setImageSize()...
    m_insideResize = false;
}

通过这种方式,您将能够确保这实际上符合您的要求。 在你开始工作后,你可以尝试找出导致递归调用的原因。我的猜测是你将图像的大小设置得比应该的大一点,这会导致按钮想要再次调整大小等。'
解决问题的正确方法是找出想要调整图像大小的正确尺寸 在这项工作之后,为了安全起见,我仍然会留下递归检查,以确保安全。

通过查看文档,看起来您想要做的是在按钮中有 QLabel 。然后在标签上调用 setPixmap(),然后将属性 scaledContents()设置为 true

现在我不确定是否只是在按钮上添加标签就可以了,因为按钮已经有了图标和文本属性。

我会将此标记为社区维基,以便您可以根据需要进行更改。

另外,根据我的经验,弄乱 resizeEvent()很少是一个好主意: - )

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top