2009-05-02 48 views
7

Tôi mới sử dụng Qt nên hãy tha thứ cho sự thiếu hiểu biết của tôi.Qt: tạo "nút hình ảnh svg"

Tôi đang cố gắng tạo nút 'svg image' bằng QSizePolicy :: Được ưu tiên cho cả ngang và dọc. Phần đó hoạt động. Khi cửa sổ được thay đổi kích thước, nút sẽ tăng lên và co lại chính xác như cách tôi muốn ... Nhưng hình ảnh trong nút vẫn giữ nguyên kích thước. Tôi muốn hình ảnh được phóng to bằng nút. Tôi đã cố gắng để quá tải resizeEvent, và gọi setImageSize, nhưng đó là vô hạn đệ quy.

#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, đó là Qt, không QT. –

Trả lời

5

Đây là cách tôi cuối cùng giải quyết nó:

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

Tránh việc đệ quy vô hạn dễ dàng. Thêm một thành viên dữ liệu boolean để SVGPushButton của bạn cho biết bạn đang ở trong một sự kiện thay đổi kích thước và kiểm tra xem nó khi bạn nhập sự kiện này như sau:

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

Với điều này bạn sẽ có thể để đảm bảo rằng điều này thực sự làm những gì bạn muốn nó làm. Sau khi bạn làm cho nó hoạt động, bạn có thể thử tìm hiểu nguyên nhân gây ra cuộc gọi đệ quy. Tôi đoán là bạn thiết lập kích thước của hình ảnh là lớn hơn một chút so với nó nên được và điều này gây ra các nút muốn thay đổi kích thước một lần nữa vv '.
Cách thích hợp để giải quyết nó sau đó là tìm ra kích thước phù hợp bạn muốn thay đổi kích thước hình ảnh.
Sau khi làm việc, tôi vẫn sẽ để lại kiểm tra đệ quy tại chỗ trong trường hợp, để được an toàn.

+0

Tôi nghĩ bạn đúng về nút hơi lớn hơn hình ảnh gây ra vòng lặp. Nhưng tôi đã thử nghiệm giải pháp của bạn và tiếc là nó không hoạt động. – user99974

4

Từ việc xem qua tài liệu, có vẻ như những gì bạn muốn làm là có một nút QLabel trong nút. Sau đó, gọi setPixmap() trên nhãn và sau đó đặt thuộc tính scaledContents() thành true.

Bây giờ, tôi không chắc liệu việc thêm nhãn vào nút có hoạt động hay không vì nút có biểu tượng và thuộc tính văn bản rồi.

Tôi sẽ đánh dấu trang này là wiki cộng đồng để bạn có thể thay đổi nếu muốn.

Ngoài ra, từ kinh nghiệm của tôi, rối tung với resizeEvent() là hiếm khi một ý tưởng tốt :-)

+0

Cảm ơn Mark. Điều đó đặt tôi vào đúng hướng. – user99974

Các vấn đề liên quan