Pergunta

Eu sou novo para o Qt por isso, desculpa a minha ignorância.

Eu estou tentando criar um 'botão de imagem SVG' um com QSizePolicy :: preferido tanto para horizontal e vertical. Essa parte funciona. Quando a janela é redimensionada, o botão aumenta e diminui exatamente como eu quero ... Mas a imagem dentro das estadias botão do mesmo tamanho. Eu gostaria da imagem em escala com o botão. Tentei sobrecarregar resizeEvent e setImageSize chamada, mas que recurses 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() );
}
Foi útil?

Solução

Isto é como eu finalmente resolvido:

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

Outras dicas

Evitando a recursividade infinita é fácil. Adicionar um membro de dados booleano para o seu SVGPushButton que indica que você está dentro de um evento de redimensionamento e verificá-lo quando você entrar no evento assim:

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

Com isso, você vai ser capaz de se certificar de que isso realmente faz o que você quer que ele faça. Depois de fazê-lo funcionar você pode tentar descobrir o que faz com que a chamada recursiva. Meu palpite é que você definir o tamanho da imagem a ser ligeiramente maior do que deveria ser, e isso faz com que o botão para deseja redimensionar novamente etc'.
A maneira correta para resolvê-lo, em seguida, é descobrir o tamanho certo que deseja redimensionar a imagem.
Após isso funciona, eu ainda deixaria a verificação de recursividade no lugar apenas no caso, para ser seguro.

De olhar sobre os docs, parece que o que você quer fazer é ter um QLabel no botão. Em seguida, chamar setPixmap() no rótulo, e, em seguida, definir o scaledContents() propriedade para true.

Agora eu não tenho certeza se apenas adicionando um rótulo para o botão vai funcionar, porque o botão tem uma propriedade ícone e texto já.

Vou marcar este como um wiki comunidade para que você pode mudá-lo se quiser.

Além disso, a partir de minha experiência, mexendo com resizeEvent() raramente é uma boa idéia: -)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top