Question

Je suis nouveau sur Qt, alors excusez mon ignorance.

J'essaie de créer un "bouton d'image svg" avec QSizePolicy :: Preferred pour les plans horizontal et vertical. Cette partie fonctionne. Lorsque la fenêtre est redimensionnée, le bouton s'agrandit et se rétrécit exactement comme je le veux ... Mais l'image dans le bouton reste de la même taille. Je voudrais que l'image soit mise à l'échelle avec le bouton. J'ai essayé de surcharger resizeEvent et d'appeler setImageSize, mais cela revient indéfiniment.

#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() );
}
Était-ce utile?

La solution

Voici comment je l'ai finalement résolu:

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

Autres conseils

Éviter la récursion infinie est facile. Ajoutez un membre de données booléen à votre SVGPushButton qui indique que vous êtes dans un événement de redimensionnement et vérifiez-le lorsque vous entrez l'événement comme suit:

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

Grâce à cela, vous pourrez vous assurer que cela fait vraiment ce que vous voulez. Une fois que cela fonctionne, vous pouvez essayer de déterminer les causes de l’appel récursif. Mon hypothèse est que vous définissez la taille de l'image pour qu'elle soit légèrement plus grande qu'elle ne devrait l'être, ce qui incite le bouton à redimensionner à nouveau, etc. '.

La bonne façon de le résoudre consiste alors à déterminer la taille à laquelle vous souhaitez redimensionner l'image.
Après que cela fonctionne, je laisserais toujours le contrôle de récursion en place au cas où, par sécurité,

.

Si vous parcourez la documentation, il semble que vous souhaitiez avoir un QLabel dans le bouton. Appelez ensuite setPixmap () sur l'étiquette, puis définissez la propriété scaledContents () sur true .

À présent, je ne sais pas si le simple fait d'ajouter une étiquette au bouton fonctionnera, car le bouton a déjà une propriété icon et text.

Je marquerai ceci comme un wiki de communauté afin que vous puissiez le changer si vous le souhaitez.

De plus, d'après mon expérience, déconner avec resizeEvent () est rarement une bonne idée: -)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top