2014-05-18 11 views
6

चारों ओर छाया रहा विजेट छाया जोड़ सकते हैं:क्यूटी: खिड़की

QGraphicsDropShadowEffect *bodyShadow = new QGraphicsDropShadowEffect; 
bodyShadow->setBlurRadius(9.0); 
bodyShadow->setColor(QColor(0, 0, 0, 160)); 
bodyShadow->setOffset(4.0); 
ui->widget->setGraphicsEffect(bodyShadow); 

लेकिन यह छाया ही छोड़ दिया और नीचे हो जाएगा। मुझे विजेट के चारों ओर छाया की जरूरत है। इसे कैसे जोड़ें?

+0

मैंने अपना जवाब अपडेट कर दिया है ताकि आप देख सकें कि विजेट पर प्रभाव कैसे लागू किया जा सकता है। – mhcuervo

उत्तर

14

आप अपना कस्टम प्रभाव बना सकते हैं। मैं एक कार्यान्वयन साझा करूंगा जो काम करता है।

customshadoweffect.h

#ifndef CUSTOMSHADOWEFFECT_H 
#define CUSTOMSHADOWEFFECT_H 

#include <QGraphicsDropShadowEffect> 
#include <QGraphicsEffect> 

class CustomShadowEffect : public QGraphicsEffect 
{ 
    Q_OBJECT 
public: 
    explicit CustomShadowEffect(QObject *parent = 0); 

    void draw(QPainter* painter); 
    QRectF boundingRectFor(const QRectF& rect) const; 

    inline void setDistance(qreal distance) { _distance = distance; updateBoundingRect(); } 
    inline qreal distance() const { return _distance; } 

    inline void setBlurRadius(qreal blurRadius) { _blurRadius = blurRadius; updateBoundingRect(); } 
    inline qreal blurRadius() const { return _blurRadius; } 

    inline void setColor(const QColor& color) { _color = color; } 
    inline QColor color() const { return _color; } 

private: 
    qreal _distance; 
    qreal _blurRadius; 
    QColor _color; 
}; 

#endif // CUSTOMSHADOWEFFECT_H 

customshadoweffect.cpp

#include "customshadoweffect.h" 
#include <QPainter> 
// #include <QGraphicsEffect> 

CustomShadowEffect::CustomShadowEffect(QObject *parent) : 
    QGraphicsEffect(parent), 
    _distance(4.0f), 
    _blurRadius(10.0f), 
    _color(0, 0, 0, 80) 
{ 
} 

QT_BEGIN_NAMESPACE 
    extern Q_WIDGETS_EXPORT void qt_blurImage(QPainter *p, QImage &blurImage, qreal radius, bool quality, bool alphaOnly, int transposed = 0); 
QT_END_NAMESPACE 

void CustomShadowEffect::draw(QPainter* painter) 
{ 
    // if nothing to show outside the item, just draw source 
    if ((blurRadius() + distance()) <= 0) { 
     drawSource(painter); 
     return; 
    } 

    PixmapPadMode mode = QGraphicsEffect::PadToEffectiveBoundingRect; 
    QPoint offset; 
    const QPixmap px = sourcePixmap(Qt::DeviceCoordinates, &offset, mode); 

    // return if no source 
    if (px.isNull()) 
     return; 

    // save world transform 
    QTransform restoreTransform = painter->worldTransform(); 
    painter->setWorldTransform(QTransform()); 

    // Calculate size for the background image 
    QSize szi(px.size().width() + 2 * distance(), px.size().height() + 2 * distance()); 

    QImage tmp(szi, QImage::Format_ARGB32_Premultiplied); 
    QPixmap scaled = px.scaled(szi); 
    tmp.fill(0); 
    QPainter tmpPainter(&tmp); 
    tmpPainter.setCompositionMode(QPainter::CompositionMode_Source); 
    tmpPainter.drawPixmap(QPointF(-distance(), -distance()), scaled); 
    tmpPainter.end(); 

    // blur the alpha channel 
    QImage blurred(tmp.size(), QImage::Format_ARGB32_Premultiplied); 
    blurred.fill(0); 
    QPainter blurPainter(&blurred); 
    qt_blurImage(&blurPainter, tmp, blurRadius(), false, true); 
    blurPainter.end(); 

    tmp = blurred; 

    // blacken the image... 
    tmpPainter.begin(&tmp); 
    tmpPainter.setCompositionMode(QPainter::CompositionMode_SourceIn); 
    tmpPainter.fillRect(tmp.rect(), color()); 
    tmpPainter.end(); 

    // draw the blurred shadow... 
    painter->drawImage(offset, tmp); 

    // draw the actual pixmap... 
    painter->drawPixmap(offset, px, QRectF()); 

    // restore world transform 
    painter->setWorldTransform(restoreTransform); 
} 

QRectF CustomShadowEffect::boundingRectFor(const QRectF& rect) const 
{ 
    qreal delta = blurRadius() + distance(); 
    return rect.united(rect.adjusted(-delta, -delta, delta, delta)); 
} 

यह लागू करने (एक ग्राफिक्स आइटम के लिए):

// ... 
CustomShadowEffect *bodyShadow = new CustomShadowEffect(); 
bodyShadow->setBlurRadius(20.0); 
bodyShadow->setDistance(6.0); 
bodyShadow->setColor(QColor(0, 0, 0, 80)); 
item->setGraphicsEffect(bodyShadow); 
// ... 

यह (एक बच्चे विजेट के लिए) आवेदन:

//... 
CustomShadowEffect *bodyShadow = new CustomShadowEffect(); 
bodyShadow->setBlurRadius(20.0); 
bodyShadow->setDistance(6.0); 
bodyShadow->setColor(QColor(0, 0, 0, 80)); 
ui->widget->setAutoFillBackground(true); 
ui->widget->setGraphicsEffect(bodyShadow); 
// ... 

परिणाम: Effect applied to a child widget in a QMainWindow

2

मैं कैसे एक कस्टम प्रभाव लागू करने के लिए की mhcuervo के उदाहरण से प्यार है। उस ने कहा, fwiw, मैं अपने विजेट का उपयोग कर बच्चे विजेट के चारों ओर एक छाया प्राप्त करने में सक्षम था, 0 का ऑफसेट, और बच्चे के विजेट के चारों ओर फैलाने के लिए एक बड़ा पर्याप्त धुंध त्रिज्या। (यह, क्यूटी 5.4 का उपयोग कर)।

+0

हां, मनमाने ढंग से ज्यामिति के विजेट्स के लिए, यह बहुत ही सरल उत्तर मेरे लिए भी काम करता था। – Matt

संबंधित मुद्दे