总有人间一两风,填我十万八千梦

QT拦截QMdiSubWindow关闭消息

Linux C/C++ Zero、J 6862℃ 0评论

今天用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的日志,子窗口还是没有关闭.subwindow

文中相关的QT工程:

百度网盘: http://pan.baidu.com/s/1bn8kMEN 密码: vr5h

转载请注明:悠然品鉴 » QT拦截QMdiSubWindow关闭消息

喜欢 (1)or分享 (0)
发表我的评论
取消评论

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址