質問
私はQtが初めてなので、無知を許してください。
水平および垂直の両方でQSizePolicy :: Preferredを使用して「svg画像ボタン」を作成しようとしています。 その部分は機能します。ウィンドウのサイズを変更すると、ボタンは希望どおりに拡大および縮小します...しかし、ボタン内の画像は同じサイズのままです。 ボタンで画像を拡大縮小したいです。 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
に設定します。
ボタンには既にアイコンとテキストのプロパティがあるため、ボタンにラベルを追加するだけで機能するかどうかはわかりません。
これをコミュニティWikiとしてマークし、必要に応じて変更できるようにします。
また、私の経験から、 resizeEvent()
をいじることはめったに良いアイデアではありません:-)