2013-10-05 9 views
8

पर QWidget पर आयताकार ओवरले बनाएं, मैं QHBoxLayout में विजेट्स के लिए EventFilter का उपयोग करता हूं।मेरी प्रोजेक्ट में

यदि मैंने किसी विजेट पर क्लिक किया है, तो मैं क्लिक किए गए विजेट पर नीले रंग के रंग के साथ एक पारदर्शी ओवरले खींचना चाहता हूं। क्या इसे लागू करने का कोई तरीका है?

बधाई

उत्तर

10

यह जवाब मेरे ओवरले से संबंधित जवाब की एक श्रृंखला में है: first, second, third। यह ऐसा करने का

एक ही रास्ता है:

  1. एक अर्द्ध पारदर्शी ओवरले विजेट भी माउस की घटनाओं के लिए पारदर्शी है कि लो।

  2. ईवेंट फ़िल्टर में, लक्ष्य विजेट के मिलान के लिए ओवरले की ज्यामिति समायोजित करके ऑब्जेक्ट्स के क्लिक और आकार का आकार ट्रैक करें।

नीचे स्वयं का निहित उदाहरण क्यूटी 4 और क्यूटी 5 दोनों के तहत काम करता है और जो भी आप चाहते हैं वह करता है।

screenshot

// https://github.com/KubaO/stackoverflown/tree/master/questions/overlay-19199863.pro 
#include <QtGui> 
#if QT_VERSION >= QT_VERSION_CHECK(5,0,0) 
#include <QtWidgets> 
#endif 

class Overlay : public QWidget { 
public: 
    Overlay(QWidget * parent = nullptr) : QWidget{parent} { 
     setAttribute(Qt::WA_NoSystemBackground); 
     setAttribute(Qt::WA_TransparentForMouseEvents); 
    } 
protected: 
    void paintEvent(QPaintEvent *) override { 
     QPainter{this}.fillRect(rect(), {80, 80, 255, 128}); 
    } 
}; 

class Filter : public QObject { 
    QPointer<Overlay> m_overlay; 
    QPointer<QWidget> m_overlayOn; 
public: 
    Filter(QObject * parent = nullptr) : QObject{parent} {} 
protected: 
    bool eventFilter(QObject * obj, QEvent * ev) override { 
     if (!obj->isWidgetType()) return false; 
     auto w = static_cast<QWidget*>(obj); 
     if (ev->type() == QEvent::MouseButtonPress) { 
      if (!m_overlay) m_overlay = new Overlay(w->parentWidget()); 
      m_overlay->setGeometry(w->geometry()); 
      m_overlayOn = w; 
      m_overlay->show(); 
     } 
     else if (ev->type() == QEvent::Resize) { 
      if (m_overlay && m_overlayOn == w) 
       m_overlay->setGeometry(w->geometry()); 
     } 
     return false; 
    } 
}; 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    Filter filter; 
    QWidget window; 
    QHBoxLayout layout(&window); 
    for (auto text : { "Foo", "Bar", "Baz "}) { 
     auto label = new QLabel{text}; 
     layout.addWidget(label); 
     label->installEventFilter(&filter); 
    } 
    window.setMinimumSize(300, 250); 
    window.show(); 
    return a.exec(); 
} 
+0

धन्यवाद :) इस भयानक काम करता है –

0

ओवरले विजेट निर्माता में:

setWindowFlags(Qt::Widget | Qt::FramelessWindowHint | Qt::ToolTip | Qt::WindowStaysOnTopHint); 
    setAttribute(Qt::WA_NoSystemBackground, true); 
    setAttribute(Qt::WA_TranslucentBackground, true); 

विंडो कि विजेट का मालिक में:

overlay_ = new RtspOverlay(this); 
overlay_->show(); 
संबंधित मुद्दे