2009-05-02 13 views
7

Sono nuovo a Qt quindi scusate la mia ignoranza.Qt: creazione di un "tasto immagine svg"

Sto tentando di creare un "pulsante immagine svg" con QSizePolicy: preferito per orizzontale e verticale. Questa parte funziona. Quando la finestra viene ridimensionata, il pulsante aumenta e si riduce esattamente come voglio ... Ma l'immagine all'interno del pulsante rimane della stessa dimensione. Desidero che l'immagine venga ridimensionata con il pulsante. Ho provato a sovraccaricare resizeEvent e chiamare setImageSize, ma ricorre in modo 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()); 
} 
+0

JFYI, è Qt, non QT. –

risposta

5

Ecco come ho finalmente 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); 
} 
4

Evitare la ricorsione infinita è facile. Aggiungere un membro di dati booleano al SVGPushButton che indica che sei all'interno di un evento resize e verificare che quando si entra l'evento in questo modo:

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

Con questo sarete in grado di fare in modo che questo in realtà fa quello lo vuoi fare. Dopo averlo fatto funzionare, puoi provare a scoprire quali sono le cause della chiamata ricorsiva. La mia ipotesi è che si imposta la dimensione dell'immagine per essere leggermente più grande di quanto dovrebbe essere e questo fa sì che il pulsante desideri ridimensionarlo di nuovo ecc.
Il modo corretto per risolverlo è quello di calcolare la giusta dimensione in cui si desidera ridimensionare l'immagine.
Dopo che questo funziona, lascerei comunque il controllo della ricorrenza in caso, per sicurezza.

+0

Penso che tu abbia ragione sul fatto che il pulsante sia leggermente più grande dell'immagine che causa il loop. Ma ho provato la tua soluzione e sfortunatamente non funziona. – user99974

4

Dall'esame dei documenti, sembra che quello che si vuole fare sia avere un QLabel nel pulsante. Quindi chiamare setPixmap() sull'etichetta e quindi impostare la proprietà scaledContents() su true.

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

Contrassegnerò questo come un wiki della comunità in modo da poterlo modificare se lo si desidera.

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

+0

Grazie Marco. Questo mi ha indirizzato nella direzione giusta. – user99974