为了账号安全,请及时绑定邮箱和手机立即绑定

单击时在QWidget上绘制矩形叠加

/ 猿问

单击时在QWidget上绘制矩形叠加

达令说 2019-11-19 14:50:41

在我的项目中,我使用的EventFilterfor窗口小部件QHBoxLayout

如果我单击一个小部件,我想在被单击的小部件上绘制一个蓝色的透明覆盖层。有办法实现吗?

问候



查看完整描述

2 回答

?
慕工程0101907

此答案是我与覆盖相关的一系列答案中的第一,第二,第三。


一种方法是:


有一个半透明的叠加小部件,它对鼠标事件也是透明的。


在事件过滤器中,通过调整覆盖的几何形状以匹配目标小部件的几何形状,跟踪对象的点击和调整大小。


下面的独立示例在Qt 4和Qt 5下均可工作,并且可以满足您的要求。

// https://github.com/KubaO/stackoverflown/tree/master/questions/overlay-19199863

#include <QtGui>

#if QT_VERSION >= QT_VERSION_CHECK(5,0,0)

#include <QtWidgets>

#endif


class Overlay : public QWidget {

public:

    explicit 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 OverlayFactoryFilter : public QObject {

    QPointer<Overlay> m_overlay;

public:

    explicit OverlayFactoryFilter(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;

            m_overlay->setParent(w);

            m_overlay->resize(w->size());

            m_overlay->show();

        }

        else if (ev->type() == QEvent::Resize) {

            if (m_overlay && m_overlay->parentWidget() == w)

                m_overlay->resize(w->size());

        }

        return false;

    }

};


int main(int argc, char *argv[])

{

    QApplication a(argc, argv);

    OverlayFactoryFilter factory;

    QWidget window;

    QHBoxLayout layout(&window);

    for (auto text : { "Foo", "Bar", "Baz "}) {

        auto label = new QLabel{text};

        layout.addWidget(label);

        label->installEventFilter(&factory);

    }

    window.setMinimumSize(300, 250);

    window.show();

    return a.exec();

}


查看完整回答
反对 回复 2019-11-19
?
慕莱坞5435954

在overlay小部件构造函数中:


    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();


查看完整回答
反对 回复 2019-11-19
  • 2 回答
  • 0 关注
  • 51 浏览
我要回答
慕课专栏
更多

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信