【问题标题】:Qt: creating an "svg image button"Qt:创建一个“svg图像按钮”
【发布时间】: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() );
}

【问题讨论】:

    标签: c++ qt


    【解决方案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() 并不是一个好主意:-)

      【讨论】:

        猜你喜欢
        • 2015-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-18
        • 2019-05-07
        相关资源
        最近更新 更多