Qt超时自动关闭子窗口

有的时候我们需要某些窗口实现超时自动关闭,但是Qt窗口一般是多部件堆叠而成,如果常规处理,对每一个部件进行鼠标点击事件处理显然不太合理。通过直接重新实现QApplication::notify函数来全局获取鼠标点击事件,最终实现功能。当然也可以在QApplication中安装事件过滤器,原理都是一样的。

bool QApplication::notify(QObject *, QEvent *); 先了解一下这个函数,所有事件都会经过这个函数的处理。所以我们处理这个问题的思路是重新实现这个函数,在这个函数里判断是否当前的事件为鼠标点击事件,如果是,则进行相应的处理。

要想重新实现bool QApplication::notify(QObject *, QEvent *);,需要子类化QApplication,然后重载notify函数

bool CGlobalApplication::notify(QObject *obj, QEvent *e)
{
    if(e->type() == QEvent::MouseButtonPress && widget)
    {
        widget->guiTimerRestart();
    }
    return QApplication::notify(obj,e);
}

在这个函数里先过滤出鼠标点击事件,然后对待监测的窗口进行操作,所以这个时候我们需要知道待监测窗口的指针。

采用的方式是,当待监测窗口被创建时,即在待监测窗口的构造函数中,我们把指针传递给CGlobalApplication,可以通过全局指针qApp实现

如下以CDialogMainMenu作为待监测窗口为例

CDialogMainMenu::CDialogMainMenu(QWidget *parent) 
    :QDialog(parent)
    ,ui(new Ui::CDialogMainMenu)
{
    ui->setupUi(this);
    auto gApp = static_cast<CGlobalApplication *>(qApp);
    if(gApp) 
    {
        gApp->setWindowInstance(this);
    }     
}

gApp->setWindowInstance(this);

通过这一步将待监测窗口CDialogMainMenu的实例化指针传递给CGlobalApplication

我们再回到notify函数,在这个函数里,每当程序收到一次鼠标点击,就调用

widget->guiTimerRestart();

在自定义函数guiTimerRestart中实现定时关闭窗口即可。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值