今天用QT做了一个模块儿,其中用到了QMdiArea这个东西,我需要获取到QMdiSubWindow关闭的消息,其实QMdiSubWindow不是关闭了,是隐藏了,为了节省内存,如果你想在MdiArea中恢复一个已经”关闭”的Sub窗口你应该去通过对应的Sub窗口的指针shownormal()显示出来;这里我分享一下我拦截Sub窗口”关闭”的操作代码.(QT工程在最后)
我的解决方法是通过重写QMdiSubWindow,在event函数中去拦截Close的事件,下面是我的相关操作类的信息:
- MainWindow,主界面类
- MySubWindow 继承自 QMdiSubWindow,用来拦截事件,注意这个类的构造函数,用这个 MySubWindow(QWidget *parent = 0, Qt::WindowFlags flags = 0);
- MyWidget,任意一个窗口,用于显示在MySubWindow中做参照
我们首先在MainWindow中先将界面显示出来,代码如下:
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); this->showMaximized (); //创建一个Mdiarea QMdiArea *mdiArea = new QMdiArea(this); //创建SubWindow MySubWindow *subWindow1 = new MySubWindow; //添加Widget MyWidget* pWidget = new MyWidget(); subWindow1->setWidget(pWidget); subWindow1->setAttribute(Qt::WA_DeleteOnClose); //添加SubWindow mdiArea->addSubWindow (subWindow1); //显示Area this->setCentralWidget (mdiArea); }
在MySubWindow中重写 bool event(QEvent *e) 这个函数:
bool MySubWindow::event(QEvent *e) { if(e->type()==QEvent::Close){ qDebug()<<"Close\n";//打印一个关闭的信息,可以看到SubWindow并没有关闭 e->ignore ();//忽略关闭用于测试 return true;//返回true表示 阻止event } return QMdiSubWindow::event(e); }
注意event的返回值,这里是QT官方的even函数信息http://doc.qt.io/qt-4.8/eventsandfilters.html
来看一下操作的效果,就只是输出了Close的日志,子窗口还是没有关闭.
文中相关的QT工程:
百度网盘: http://pan.baidu.com/s/1bn8kMEN 密码: vr5h
转载请注明:悠然品鉴 » QT拦截QMdiSubWindow关闭消息