Qt: a criação de um “botão de imagem SVG”
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() );
}
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: -)