Pregunta

Soy nuevo en Qt, así que disculpe mi ignorancia.

Estoy intentando crear un botón 'svg image' con QSizePolicy :: Preferred tanto para horizontal como para vertical. Esa parte funciona. Cuando se cambia el tamaño de la ventana, el botón crece y se encoge exactamente como quiero ... Pero la imagen dentro del botón permanece del mismo tamaño. Me gustaría que la imagen a escala con el botón. Intenté sobrecargar resizeEvent, y llamé a setImageSize, pero eso se repite infinitamente.

#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() );
}
¿Fue útil?

Solución

Así es como finalmente lo resolví:

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

Otros consejos

Evitar la recursión infinita es fácil. Agregue un miembro de datos booleanos a su SVGPushButton que indica que está dentro de un evento de cambio de tamaño y verifíquelo cuando ingrese al evento de la siguiente manera:

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

Con esto podrás asegurarte de que realmente hace lo que quieres que haga. Después de que funcione, puede intentar averiguar qué causa la llamada recursiva. Mi conjetura es que configuras el tamaño de la imagen para que sea un poco más grande de lo que debería ser y esto hace que el botón desee cambiar el tamaño de nuevo, etc. '. La forma correcta de resolverlo es calcular el tamaño correcto al que desea cambiar el tamaño de la imagen.
Después de que esto funcione, seguiría dejando el control de recursión en su lugar por si acaso, para estar seguro.

Al mirar los documentos, parece que lo que quieres hacer es tener un QLabel en el botón. Luego llame a setPixmap () en la etiqueta, y luego establezca la propiedad scaledContents () en true .

Ahora no estoy seguro si solo agregar una etiqueta al botón funcionará, porque el botón ya tiene un icono y una propiedad de texto.

Marcaré esto como un wiki de la comunidad para que puedas cambiarlo si lo deseas.

También, desde mi experiencia, jugar con resizeEvent () rara vez es una buena idea :-)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top