2014-12-18 14 views
7

Tôi đang cố triển khai một cái gì đó như "biểu tượng được soạn" trong Qt.QIcon tùy chỉnh sử dụng QIconEngine và độ trong suốt

Mục tiêu: Tôi cần động lực đặt màu chỉ cho phần biểu tượng.

Ý tưởng của tôi: Soạn biểu tượng này bằng hai cách khác. Một biểu tượng sẽ được tô màu như mong muốn (có thể bằng ColorizeEffect) và trộn nó dưới biểu tượng thứ hai hoạt động như lớp lớp phủ.

Vấn đề: tôi đã cố gắng QIconEngine và thực hiện các phương pháp sơn của nó. ColorizeEffect dường như không hoạt động (ngay cả khi tôi thử hack với QLabel tạm thời cho điều đó - khi sức mạnh được thiết lập> 0.0, QIcon được hình thành bởi nó trống). Nhưng đó không phải là vấn đề chính. Vấn đề là, dù tôi có làm gì đi nữa, tôi vẫn nhận được một số màu nền mặc định cho biểu tượng "sáng tác" này.
Two QToolButtons with QIcons, left icon is simple QIcon, right is my "Composed" icon


Dưới đây là đoạn mã của tôi:

class QComposedIconEngine: public QIconEngine 
{ 
public: 
    QComposedIconEngine(); 
    ~QComposedIconEngine(); 
    virtual void paint (QPainter * painter, const QRect & rect, QIcon::Mode mode, QIcon::State state); 
    virtual QIconEngine * clone(void) const; 
public: 
    QIcon m_qIconA; 
    QIcon m_qIconB; 
    QColor m_qColor; 
}; 

Và đây là thực hiện của tôi về sơn (...):

void CLxQComposedIconEngine::paint (QPainter * painter, const QRect & rect, QIcon::Mode mode, QIcon::State state) 
{ 
    QBrush brush = painter->background(); 
    QColor color = brush.color(); 
    brush.setColor(Qt::transparent); 
    painter->setBackground(brush); 
    painter->eraseRect(rect); 
    painter->setCompositionMode(QPainter::CompositionMode_SourceOver); 
    m_qIconA.paint(painter, rect, Qt::AlignCenter, mode, state); 
}; 

Và đây là cách tôi tạo biểu tượng "Đã soạn":

QComposedIconEngine * qIconEngine = new QComposedIconEngine(); 
QIcon i1; 
QIcon i2; 
i1.addPixmap(...); 
i2.addPixmap(...); 
qIconEngine->m_qIconA = i1; 
qIconEngine->m_qIconB = i2; 
QIcon i3(qIconEngine); 

Tôi mong đợi i1 và i3 trông giống hệt nhau. Và bên cạnh nền tảng chết tiệt nó thực sự là. Nhưng tôi cần phải minh bạch.

(ngay cả khi tôi rời khỏi phương pháp sơn của tôi (...) rỗng, nền chết tiệt là có!)

Có ai biết làm thế nào để làm cho nền trong suốt? Cảm ơn.

+0

Tài liệu của QIconEngine cho biết "sử dụng QIconEngineV2". Bạn đã thử chưa –

+0

Tất nhiên. Không có hiệu lực. Fortunatelly Tôi giải quyết vấn đề này. Đó là cách QIconEngine được gọi từ bên ngoài. Tôi sẽ tự mình biên dịch câu trả lời ... :-) – GPUquant

Trả lời

4

Tôi đã giải quyết vấn đề này. Vấn đề là, phương pháp sơn (...) gần như mọi lúc được gọi thông qua phương thức pixmap (...) - cũng có thể được thực hiện lại. Nếu bạn để triển khai mặc định, phương pháp này tạo mới QPixmap, tạo QPainter trên đó và gọi sơn (...) phù thủy họa sĩ này. Nhưng đó là vấn đề - vì QPixmap đã tạo không chứa kênh alpha, nó không thể bán trong suốt. Vì vậy, bạn cần phải reimplement pixmap phương pháp (...) như thế này:

QPixmap CLxQComposedIconEngine::pixmap (const QSize & size, QIcon::Mode mode, QIcon::State state) 
{ 
    QImage img(size, QImage::Format_ARGB32); 
    img.fill(qRgba(0,0,0,0)); 
    QPixmap pix = QPixmap::fromImage(img, Qt::NoFormatConversion); 
    { 
     QPainter painter (&pix); 
     QRect r(QPoint(0.0,0.0), size); 
     this->paint(&painter, r, mode, state);  
    } 
    return pix;  
}; 

Mấu chốt là hai hàng đầu tiên ... Nếu không có sự img.fill() nó sẽ là không minh bạch.

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