Qt:创建一个“svg图像按钮”

Posted

技术标签:

【中文标题】Qt:创建一个“svg图像按钮”【英文标题】:Qt: creating an "svg image button" 【发布时间】:2009-05-02 20:45:26 【问题描述】:

我是 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() );

【问题讨论】:

【参考方案1】:

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

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 );

【讨论】:

【参考方案2】:

避免无限递归很容易。向您的 SVGPushButton 添加一个布尔数据成员,指示您在调整大小事件中,并在您输入事件时检查它,如下所示:

void SVGPushButton::resizeEvent (QResizeEvent * event)

    if (m_insideResize)
        return;
    m_insideResize = true;
    // call setImageSize()...
    m_insideResize = false;

有了这个,你就可以确保它确实能做你想做的事。 让它工作后,您可以尝试找出导致递归调用的原因。我的猜测是您将图像的大小设置为略大于应有的大小,这会导致按钮想要再次调整大小等。 那么解决这个问题的正确方法是找出你想要调整图像大小的正确尺寸。 在此工作之后,为了安全起见,我仍然会保留递归检查以防万一。

【讨论】:

我认为您对按钮略大于导致循环的图像的看法是正确的。但我测试了你的解决方案,不幸的是它不起作用。【参考方案3】:

通过查看文档,您似乎想要在按钮中添加 QLabel。然后在标签上调用setPixmap(),然后将属性scaledContents()设置为true

现在我不确定是否只向按钮添加标签是否有效,因为按钮已经具有图标和文本属性。

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

另外,根据我的经验,搞乱resizeEvent() 并不是一个好主意:-)

【讨论】:

以上是关于Qt:创建一个“svg图像按钮”的主要内容,如果未能解决你的问题,请参考以下文章

C++Qt入门---Qt简介,第一个Qt程序,Qt按钮

qt中如何创建2个窗口,点击窗口a上按钮打开窗口b,在b关闭前无法对a操作

使用 QT 设计器创建的新插槽的代码在哪里?

qt鼠标悬停在按钮变大

在当前文件中按下按钮后,如何打开另一个 qt 设计器文件?

如何在 Qt Designer 中创建圆形按钮