2013-09-30 7 views
16

मैं QLabel में फीका और फीका करने की कोशिश कर रहा हूं या उस मामले के लिए QWidget सबक्लास। मैंने QGraphicsEffect के साथ प्रयास किया है, लेकिन दुर्भाग्य से यह केवल विंडोज़ पर काम करता है, मैक पर नहीं।क्यूटी विजेट्स को कैसे फीका या फीका करना है?

केवल अन्य समाधान है जो दोनों मैक & विंडोज पर काम कर सकते हैं अपने खुद के कस्टम paintEvent जहाँ मैं QPainter की अस्पष्टता सेट करते हैं और मेरी व्युत्पन्न QLabel में "अस्पष्टता" के लिए एक Q_PROPERTY को परिभाषित करने और QPropertyAnimation के माध्यम से अपारदर्शिता बदलने होने जा रहा है ।

मैं आपके संदर्भ के लिए प्रासंगिक कोड स्निपेट के नीचे पेस्ट कर रहा हूं। मुझे अभी भी एक समस्या दिखाई दे रही है - QLabel::paintEvent का उपयोग करना प्रतीत नहीं होता है, यह केवल तभी काम करता है जब मैं QPainter का उपयोग कर एक पूर्ण कस्टम पेंटिंग करता हूं, लेकिन यह एक आसान तरीका प्रतीत नहीं होता है और यदि मुझे ऐसा करने की ज़रूरत है प्रत्येक QWidget सबक्लास के लिए मैं फीका करना चाहता हूं, यह एक दुःस्वप्न है। अगर मैं यहां कोई स्पष्ट गलती कर रहा हूं तो कृपया स्पष्ट करें।

Q_PROPERTY(qreal opacity READ opacity WRITE setOpacity) 

void MyLabel::setOpacity(qreal value) { 
    m_Opacity = value; 
    repaint(); 
} 

void MyLabel::paintEvent((QPaintEvent *pe) { 
    QPainter p; 
    p.begin(this); 
    p.setOpacity(); 
    QLabel::paintEvent(pe); 
    p.end(); 
} 

void MyLabel::startFadeOutAnimation() { 
    QPropertyAnimation *anim = new QPropertyAnimation(this, "opacity"); 
    anim->setDuration(800); 
    anim->setStartValue(1.0); 
    anim->setEndValue(0.0); 
    anim->setEasingCurve(QEasingCurve::OutQuad); 
    anim->start(QAbstractAnimation::DeleteWhenStopped); 
} 
+0

क्यूटी एपीआई आप एक तरह से यह प्रयोग कर रहे हैं आप कह रहा है बाहर यह इस्तेमाल किया जा नहीं था । विजेट्स वास्तव में महान कलाकार नहीं होते हैं जब आप उनकी सामग्री को एनिमेट करना चाहते हैं। यह सबूत-अवधारणा के लिए काम कर सकता है, लेकिन लंबे समय तक आपको क्यूटी क्विक का उपयोग करना चाहिए। चाहे आप क्यूटी क्विक 1 या क्यूटी क्विक 2 का उपयोग कर रहे हों, यहां तक ​​कि क्यूटी क्विक 1 (घोषणात्मक मॉड्यूल) भी आपके द्वारा किए जा रहे कार्यों में सुधार होगा। –

उत्तर

1

आप अपने विजेट को QGraphicsScene में डाल सकते हैं। यह अस्पष्टता बदलने और एनीमेशन का समर्थन करता है।

उदाहरण के लिए QGraphicsProxyWidget दस्तावेज़ीकरण देखें।

1

पैलेट के कुछ हिस्से का पर्दाफाश की कोशिश करो के रूप में लेबल की संपत्ति तो यह चेतन:

Q_PROPERTY(QColor color READ color WRITE setColor) 

void MyLabel::setColor(const QColor &value) { 
    QPalette palette; 
    palette.setBrush(QPalette::WindowText, value); 
    setPalette(palette); 
} 

QColor MyLabel::color() { 
    return palette(QPalette::Normal, QPalette::Window). 
} 

void MyLabel::startFadeOutAnimation() { 
    QPropertyAnimation *animation = new QPropertyAnimation(label, "color", this); 
    QColor c = label->color(); 
    animation->setKeyValueAt(0, c); 
    c.setAlpha(0); 
    animation->setKeyValueAt(1, c); 
    animation->setEasingCurve(QEasingCurve::OutQuad); 
    animation->setDuration(1000); 
    animation->start(QAbstractAnimation::DeleteWhenStopped); 
} 

आप को परिभाषित करने और नई क्षेपक जो QPalette qRegisterAnimationInterpolator संभाल लेंगे पंजीकरण से उपवर्गीकरण से बचने की कोशिश कर सकते हैं, लेकिन यह थोड़ा जटिल है।

20

वास्तव में QPaintEvent इंटरसेप्ट्स के बिना और QGraphicsProxyWidget की कठिन आवश्यकताओं के बिना ऐसा करने का एक आसान आसान तरीका है, जो प्रचारित विजेट बच्चों पर काम नहीं करता है। नीचे दी गई तकनीक प्रचारित विजेट और उनके बच्चों के विगेट्स के साथ भी काम करेगी।

फीका आपका विजेट

// w is your widget 
QGraphicsOpacityEffect *eff = new QGraphicsOpacityEffect(this); 
w->setGraphicsEffect(eff); 
QPropertyAnimation *a = new QPropertyAnimation(eff,"opacity"); 
a->setDuration(350); 
a->setStartValue(0); 
a->setEndValue(1); 
a->setEasingCurve(QEasingCurve::InBack); 
a->start(QPropertyAnimation::DeleteWhenStopped); 

धूमिल कर दें आपका विजेट

// w is your widget 
QGraphicsOpacityEffect *eff = new QGraphicsOpacityEffect(this); 
w->setGraphicsEffect(eff); 
QPropertyAnimation *a = new QPropertyAnimation(eff,"opacity"); 
a->setDuration(350); 
a->setStartValue(1); 
a->setEndValue(0); 
a->setEasingCurve(QEasingCurve::OutBack); 
a->start(QPropertyAnimation::DeleteWhenStopped); 
connect(a,SIGNAL(finished()),this,SLOT(hideThisWidget())); 
// now implement a slot called hideThisWidget() to do 
// things like hide any background dimmer, etc. 
संबंधित मुद्दे