Qt: создание кнопки & svg image & # 8221;
Вопрос
Я новичок в Qt, поэтому прошу прощения за мое невежество.
Я пытаюсь создать 'кнопку изображения svg' с QSizePolicy :: Preferred для горизонтальной и вертикальной. Эта часть работает. При изменении размера окна кнопка увеличивается и сжимается именно так, как я хочу ... Но изображение внутри кнопки остается того же размера. Я бы хотел, чтобы изображение масштабировалось с помощью кнопки. Я пытался перегрузить resizeEvent и вызвать setImageSize, но это бесконечно повторяется.
#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() );
}
Решение
Вот как я в конце концов решил это:
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 );
}
Другие советы
Избежать бесконечной рекурсии легко. Добавьте логический элемент данных в ваш SVGPushButton, который указывает, что вы находитесь внутри события изменения размера, и проверьте его при вводе события следующим образом:
void SVGPushButton::resizeEvent (QResizeEvent * event)
{
if (m_insideResize)
return;
m_insideResize = true;
// call setImageSize()...
m_insideResize = false;
}
С этим вы сможете убедиться, что это действительно то, что вы хотите.
После того, как вы заставите его работать, вы можете попытаться выяснить, что вызывает рекурсивный вызов. Я предполагаю, что вы устанавливаете размер изображения немного большим, чем должно быть, и это заставляет кнопку снова хотеть изменить размер и т. Д. '.
Правильный способ решить эту проблему - определить правильный размер, к которому вы хотите изменить размер изображения.
После этой работы я бы на всякий случай оставил проверку рекурсии на всякий случай.
Из просмотра документов видно, что на кнопке есть QLabel
. Затем вызовите setPixmap ()
для метки, а затем установите для свойства scaledContents ()
значение true
.
Теперь я не уверен, сработает ли просто добавление метки к кнопке, потому что у кнопки уже есть значок и текстовое свойство. Р>
Я отмечу это как вики сообщества, чтобы вы могли изменить его, если хотите. Р>
Кроме того, по моему опыту, связываться с resizeEvent ()
редко бывает хорошей идеей: -)