2013-10-05 56 views
8

在我的項目中,我使用了一個EventFilter作爲窗口小部件,在QHBoxLayout中。在QWidget上繪製矩形疊加點擊

如果我點擊一個小部件,我想在點擊的小部件上繪製一個帶有藍色的透明覆蓋圖。 有沒有一種方法來實現這一點?

問候

回答

10

這個答案是在一個系列我覆蓋相關答案:firstsecondthird。這樣做的

一種方法是:

  1. 有一個半透明的覆蓋小部件,也是透明的鼠標事件。

  2. 在事件過濾器中,通過調整疊加層的幾何圖形以匹配目標窗口小部件的幾何圖形來跟蹤對象的點擊和調整大小。

下面的自包含示例在Qt 4和Qt 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();