Вопрос

Я новичок в 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 () редко бывает хорошей идеей: -)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top