QWidget获取外部控件的鼠标点击事件

9 篇文章 7 订阅
本文介绍了如何在Qt中创建一个自定义的弹窗控件,该控件继承自QWidget,并通过重写eventFilter()方法来过滤外部鼠标点击事件,以避免Qt::Popup属性带来的阴影效果和鼠标事件透传问题。核心代码展示了如何使用事件过滤器和设置窗体属性来实现所需功能。
摘要由CSDN通过智能技术生成

背景

有时候我们想自定义Qt控件(派生自QWidget),实现类似Qt::Popup属性的弹窗,同时避免Qt::Popup属性所带来的***副作用***(阴影效果、鼠标事件透传)。

涉及技术

  • 事件过滤器:eventFilter()

  • 窗体属性设置:setWindowFlags()setAttribute()(非必需,仅用于美化样式)

核心代码

  • ButtonMenu.cpp

    ButtonMenu类为自定义弹窗类,重写eventFilter()方法,实现对外部控件的鼠标点击事件的过滤与处理。

// 此函数内部代码,仅作外观美化之用
void ButtonMenu::init()
{
    setWindowFlags(Qt::FramelessWindowHint);
    setAttribute(Qt::WA_TranslucentBackground);
} 

// 事件过滤器
bool ButtonMenu::eventFilter(QObject *obj, QEvent *e)
{
    // 截获鼠标点击事件
    if (e->type() == Qt::MouseButtonPress)
    {
        // 当鼠标点击事件的主体不是此弹窗时,就隐藏此弹窗
        if (obj != this) hide();
    }
    
    // 调用父类同名事件,避免可能产生的bug
    return QWidget::eventFilter(obj, e);
} 
  • MainWindow.cpp

    MainWindow.cpp为程序主窗口,让它安装ButtonMenu对象的事件过滤器,以实现鼠标点击事件的过滤。

// `_menuBtn`为`ButtonMenu`对象的指针
void MainWindow::init()
{
    installEventFilter(_menuBtn);
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值