Qt: creazione di un "pulsante immagine svg"
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() );
}
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 :-)