سؤال

وأنا جديدة على QT لذا يرجى عذر جهلي.

وأنا محاولة لخلق و"SVG زر صورة" مع QSizePolicy :: المفضلة لكلا الأفقي والرأسي. هذا الجزء يعمل. عندما يتم تغيير حجم النافذة، وزر ينمو ويتقلص بالضبط كيف تريد ... ولكن الصورة داخل زر يبقى بنفس الحجم. أود الصورة لحجم باستخدام زر. حاولت الزائد resizeEvent، وندعو setImageSize، ولكن هذا recurses ما لا نهاية.

#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