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
中实现定时关闭窗口即可。文章来源:https://www.toymoban.com/news/detail-497657.html
如果有任何疑问,欢迎提出,互相交流共同进步。文章来源地址https://www.toymoban.com/news/detail-497657.html
到了这里,关于QT`实现鼠标超时未点击,窗口自动关闭的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!