有些時候我們希望通過鼠標點擊窗口外部來關閉當前窗口,這裏主要用到兩種方法;
- [virtual] bool QObject::event(QEvent *e);
- [virtual] bool QObject::eventFilter(QObject *watched, QEvent *event);
方式一:重寫窗口[virtual] bool QObject::event(QEvent *e)
該方式最簡單,但是有一個弊病,需要爲每個要實現該功能的窗口都重寫該函數。
bool Form::event(QEvent *event)
{
if (event->type() == QEvent::ActivationChange)
{
if(QApplication::activeWindow() != this)
{
this->close();
}
}
return QWidget::event(event);
}
方式二:重寫[virtual] bool QObject::eventFilter(QObject *watched, QEvent *event)
步驟一:爲每個要實現該功能的窗口安裝事件過濾void QObject::installEventFilter(QObject *filterObj),一般在構造函數裏安裝;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//f和f1都是窗口類實例
f=new Form;
f1=new Form1;
f->installEventFilter(this);
f1->installEventFilter(this);
}
步驟二:重寫事件過濾函數
bool MainWindow::eventFilter(QObject *watched, QEvent *event)
{
if (event->type() == QEvent::ActivationChange)
{
if(watched == f || watched == f1)//需要實現該功能的控件
{
if(QApplication::activeWindow() != watched)
{
QWidget *w=static_cast<QWidget *>(watched);
w->close();
}
}
}
return QMainWindow::eventFilter(watched, event);
}
這樣就在父窗口裏實現了每個子窗口的點擊窗口外關閉該窗口的功能,這樣的實現還有一個缺陷,註冊了事件過濾的窗口類只能有一個窗口可以顯示,在打開其他窗口的同時會自動關閉現有激活的子窗口