在我们自己写的软件中有一些窗口的处理通常需要统一管理,这个时候可以利用重写Application来用Notify()进行统一管理,先捕获我们自己需要处理的事件进行一些操作,再使用QApplication::notify(obj, event)来处理其他的事件。
下面的例子就是一个软件中可能会有很多的菜单项(自定义的QWidget),当软件失去活动的时候(当然你也可以铺获每一个窗体的QEvent::WindowDeactivate来关闭),或者点击到其他区域,将其菜单关闭。
以次类推,这个技巧可以用于很多场景处理,需要软件统一进行提前处理的一些事件。
#include "CBillfishApplication.h"
#include "CAppSingleton.h"
#include <QMouseEvent>
#include <QWidget>
#include <QEvent>
#include <QCursor>
#include <QDebug>
#include <stdio.h>
#include <QDateTime>
CBillfishApplication::CBillfishApplication(int argc, char *argv[]):
QApplication(argc, argv)
{
setQuitOnLastWindowClosed( false );
}
CBillfishApplication::~CBillfishApplication()
{
}
bool CBillfishApplication::notify(QObject *obj, QEvent *event)
{
if (!obj)
{
return false;
}
//整个软件所有的下拉菜单都设置顶层属性,应该注册到application然后有这里当应用程序失去活动的时候 统一关闭,防止切换应用程序的时候顶层窗口一直在桌面顶层
if (event->type() == QEvent::ApplicationDeactivated)//可以设置此处的event->type()来捕获不同类型的event事件
{
//应用程序失去活动事件,关闭所有注册的菜单项
QList<QWidget*>& list = CAppSingleton::getInstance()->GetAllMenu();
QList<QWidget*>::const_iterator it(list.begin());
for (; it != list.end(); it++)
{
QWidget* menu = *it;
if (menu && menu->isVisible())
{
menu ->close();
}
}
//处理完一次,list会清空
list.clear();
}
if (event->type() == QMouseEvent::MouseButtonPress)//可以设置此处的event->type()来捕获不同类型的event事件
{
// 处理菜单
QList<QWidget*>& list = CAppSingleton::getInstance() -> GetAllMenu();
QList<QWidget*>::const_iterator it( list.begin() );
for (; it != list.end(); it++)
{
QWidget* menu = *it;
if (menu && menu -> isVisible())
{
QRect rc = menu -> rect();
QPoint pt = menu -> mapFromGlobal(QCursor::pos());
if (!rc.contains(pt))
{
QEvent windowDeactivate(QEvent::WindowDeactivate);
QEvent activationChange(QEvent::ActivationChange);
sendEvent( menu, &windowDeactivate );
sendEvent( menu, &activationChange );
//break;
}
}
}
//处理完一次,list会清空
list.clear();
// 处理标注
QList<QWidget*>& noteList = CAppSingleton::getInstance() -> GetAllNote();
QList<QWidget*>::const_iterator noteIt( noteList.begin() );
for (; noteIt != noteList.end(); noteIt++) {
QWidget* noteWidget = ( *noteIt);
QRect noteRc = noteWidget -> rect();
QPoint pt = noteWidget -> mapFromGlobal( QCursor::pos() );
if ( !noteRc.contains( pt ) ) {
QEvent windowDeactivate( QEvent::WindowDeactivate );
QEvent activationChange( QEvent::ActivationChange );
sendEvent( noteWidget, &windowDeactivate );
sendEvent( noteWidget, &activationChange );
}
}
}
else if (event->type() == QEvent::NonClientAreaMouseButtonRelease)
{
}
return QApplication::notify(obj, event);
}
472

被折叠的 条评论
为什么被折叠?



