QT實(shí)現(xiàn)鼠標(biāo)超時(shí)未點(diǎn)擊,窗口自動(dòng)關(guān)閉
前言
有的時(shí)候我們需要某些窗口實(shí)現(xiàn)超時(shí)自動(dòng)關(guān)閉,但是Qt窗口一般是多部件堆疊而成,如果常規(guī)處理,對(duì)每一個(gè)部件進(jìn)行鼠標(biāo)點(diǎn)擊事件處理顯然不太合理,我個(gè)人參考了網(wǎng)上前輩的處理方法,通過(guò)直接重新實(shí)現(xiàn)QApplication::notify
函數(shù)來(lái)全局獲取鼠標(biāo)點(diǎn)擊事件,最終實(shí)現(xiàn)功能。當(dāng)然也可以在QApplication
中安裝事件過(guò)濾器,原理都是一樣的。
bool QApplication::notify(QObject *, QEvent *);
先了解一下這個(gè)函數(shù),所有事件都會(huì)經(jīng)過(guò)這個(gè)函數(shù)的處理。所以我們處理這個(gè)問(wèn)題的思路是重新實(shí)現(xiàn)這個(gè)函數(shù),在這個(gè)函數(shù)里判斷是否當(dāng)前的事件為鼠標(biāo)點(diǎn)擊事件,如果是,則進(jìn)行相應(yīng)的處理。
要想重新實(shí)現(xiàn)bool QApplication::notify(QObject *, QEvent *);
,需要子類化QApplication
,然后重載notify
函數(shù)
bool CGlobalApplication::notify(QObject *obj, QEvent *e)
{
if(e->type() == QEvent::MouseButtonPress && widget) {
widget->guiTimerRestart();
}
return QApplication::notify(obj,e);
}
在這個(gè)函數(shù)里先過(guò)濾出鼠標(biāo)點(diǎn)擊事件,然后對(duì)待監(jiān)測(cè)的窗口進(jìn)行操作,所以這個(gè)時(shí)候我們需要知道待監(jiān)測(cè)窗口的指針。
采用的方式是,當(dāng)待監(jiān)測(cè)窗口被創(chuàng)建時(shí),即在待監(jiān)測(cè)窗口的構(gòu)造函數(shù)中,我們把指針傳遞給CGlobalApplication
,可以通過(guò)全局指針qApp
實(shí)現(xiàn)
如下以CDialogMainMenu
作為待監(jiān)測(cè)窗口為例
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);
通過(guò)這一步將待監(jiān)測(cè)窗口CDialogMainMenu
的實(shí)例化指針傳遞給CGlobalApplication
我們?cè)倩氐?code>notify函數(shù),在這個(gè)函數(shù)里,每當(dāng)程序收到一次鼠標(biāo)點(diǎn)擊,就調(diào)用widget->guiTimerRestart();
在我個(gè)人自定義函數(shù)guiTimerRestart
中實(shí)現(xiàn)定時(shí)關(guān)閉窗口即可。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-497657.html
如果有任何疑問(wèn),歡迎提出,互相交流共同進(jìn)步。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-497657.html
到了這里,關(guān)于QT`實(shí)現(xiàn)鼠標(biāo)超時(shí)未點(diǎn)擊,窗口自動(dòng)關(guān)閉的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!