2009-05-02 221 views
7

我是Qt新手,請原諒我的無知。Qt:創建一個「svg圖像按鈕」

我正在嘗試用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()); 
} 
+0

JFYI,它的Qt的,不是QT。 – 2009-06-09 21:54:19

回答

5

一個好主意,這是怎麼了我終於解決它:

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); 
} 
4

避免無限遞歸很容易。添加一個布爾值數據成員的SVGPushButton,表示你是一個調整大小事件中,並檢查它,當你進入像這樣的事件:

void SVGPushButton::resizeEvent (QResizeEvent * event) 
{ 
    if (m_insideResize) 
     return; 
    m_insideResize = true; 
    // call setImageSize()... 
    m_insideResize = false; 
} 

有了這個,你就可以確保這實際上做什麼你想要它做。 在你使用它之後,你可以嘗試找出導致遞歸調用的原因。我的猜測是,你設置圖像的大小比它應該稍大,這會導致按鈕想要再次調整大小等。
解決問題的正確方法是找出想調整圖像大小的正確大小。
這樣做後,我仍然會保留遞歸檢查以防萬一,以保證安全。

+0

我認爲你是正確的關於比導致循環的圖像稍大的按鈕。但我測試了你的解決方案,不幸的是它不工作。 – user99974 2009-05-02 21:10:29

4

從查看文檔看,你想要做的是在按鈕中有一個QLabel。然後在標籤上撥打setPixmap(),然後將物業scaledContents()設置爲true

現在我不確定是否只需向該按鈕添加標籤就可以工作,因爲該按鈕已具有圖標和文本屬性。

我會將其標記爲社區wiki,以便您可以根據需要進行更改。

而且,從我的經驗,與resizeEvent()搞亂很少:-)

+0

謝謝馬克。這使我在正確的方向。 – user99974 2009-05-03 01:40:54