Domanda

Sono nuovo di Qt, quindi scusate la mia ignoranza.

Sto tentando di creare un "pulsante immagine svg" con QSizePolicy :: Preferito sia per orizzontale che per verticale. Quella parte funziona. Quando la finestra viene ridimensionata, il pulsante cresce e si restringe esattamente come voglio ... Ma l'immagine all'interno del pulsante rimane della stessa dimensione. Vorrei ridimensionare l'immagine con il pulsante. Ho provato a sovraccaricare resizeEvent e ho chiamato setImageSize, ma questo si ripete all'infinito.

#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() );
}
È stato utile?

Soluzione

Questo è il modo in cui alla fine l'ho risolto:

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

Altri suggerimenti

Evitare la ricorsione infinita è facile. Aggiungi un membro booleano di dati al tuo SVGPushButton che indica che sei all'interno di un evento di ridimensionamento e controllalo quando entri nell'evento in questo modo:

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

Con questo sarai in grado di assicurarti che questo faccia effettivamente quello che vuoi che faccia. Dopo averlo fatto funzionare, puoi provare a scoprire quali sono le cause della chiamata ricorsiva. La mia ipotesi è che tu abbia impostato la dimensione dell'immagine in modo che sia leggermente più grande di quanto dovrebbe essere e questo fa sì che il pulsante voglia ridimensionare di nuovo ecc. '
Il modo corretto per risolverlo quindi è capire la giusta dimensione in cui si desidera ridimensionare l'immagine.
Dopo che funziona, lascerei comunque il controllo di ricorsione in atto per sicurezza,

Guardando i documenti, sembra che quello che vuoi fare sia avere un QLabel nel pulsante. Quindi chiama setPixmap () sull'etichetta, quindi imposta la proprietà scaledContents () su true .

Ora non sono sicuro se l'aggiunta di un'etichetta al pulsante funzionerà, poiché il pulsante ha già un'icona e una proprietà di testo.

Lo segnerò come un wiki della comunità in modo che tu possa cambiarlo se vuoi.

Inoltre, dalla mia esperienza, fare casini con resizeEvent () è raramente una buona idea :-)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top