gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 00:50:20 27 4
gpt4 key购买 nike

在我的项目中,我使用 EventFilter对于位于 QHBoxLayout 中的小部件.

如果我点击了一个小部件,我想在点击的小部件上绘制一个蓝色的透明叠加层。
有没有办法实现这个?

问候

最佳答案

这个答案在我与叠加相关的一系列答案中:first , second , third .

一种方法是:

  • 有一个对鼠标事件也是透明的半透明覆盖小部件。
  • 在事件过滤器中,通过调整叠加的几何形状以匹配目标小部件的几何形状来跟踪对象的点击和调整大小。

  • 下面的自包含示例在 Qt 4 和 Qt 5 下都可以使用,并且可以执行您想要的操作。

    screenshot
    // 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();
    }

    关于qt - 单击时在 QWidget 上绘制矩形叠加层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19199863/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com