问:如何知道QMdiSubWindow何时关闭?

时间:2012-01-11 11:16:20

标签: qt

当用户关闭QMdiSubWindow时,有什么方法可以得到通知吗?我在QMdiAreaQMdiSubWindow中找不到任何暗示我可以的信号。

我认为我唯一的机会是通过继承QMdiSubWindow并覆盖close事件,但还有其他方法吗?

5 个答案:

答案 0 :(得分:2)

是的,还有另一种方法:您可以在您创建的QMdiSubWindow上安装事件过滤器:

MdiSubWindowEventFilter * p_mdiSubWindowEventFilter;

...

QMdiSubWindow * subWindow = mdiArea->addSubWindow(pEmbeddedWidget);
subWindow->installEventFilter(p_mdiSubWindowEventFilter);
subWindow->setAttribute(Qt::WA_DeleteOnClose, true); // not mandatory, depends if you manage subWindows lifetime

bool MdiSubWindowEventFilter::eventFilter(QObject * obj, QEvent * e)
{
    switch (e->type())
    {
        case QEvent::Close:
        {
            QMdiSubWindow * subWindow = dynamic_cast<QMdiSubWindow*>(obj);
            Q_ASSERT (subWindow != NULL);

            //
            // do what you want here
            //

            break;
        }
        default:
            qt_noop();
    }
    return QObject::eventFilter(obj, e);
}

答案 1 :(得分:1)

我认为除了你所描述的(覆盖关闭事件)之外,没有任何其他方式能够准确地完成您的要求。

可能还有其他方法可以实现您想要的功能而不会这样做,具体取决于您何时知道何时关闭。其他选项可能是使用destroyed信号,检查QApplication::focusWidget(),或者让父母检查其children

编辑以回复评论:

在销毁QObjects时,信号和插槽会自动断开连接,我建议您使用QSharedPointersQScopedPointers来处理QObjects的生命周期。通过应用这些技术,您不需要来自关闭窗口的信号。

答案 2 :(得分:1)

我遇到了同样的麻烦,但在我的情况下,任务更具体:&#34;当我按下关闭按钮而不是关闭&#34;时如何隐藏子窗口。所以我用以下方法解决了这个问题:

subwindow->setAttribute(Qt::WA_DeleteOnClose, false);

也许这不是一个相关的答案,但它可能对某人有用。

答案 3 :(得分:0)

这是我结束编码的内容。

#ifndef __MYSUBWINDOW_H
#define __MYSUBWINDOW_H

#include <QMdiSubWindow>
#include <QCloseEvent>
#include <QDebug>

class MyQMdiSubWindow : public QMdiSubWindow
{
    Q_OBJECT

signals:
    void closed( const QString );

protected:
    void closeEvent( QCloseEvent * closeEvent )
    {
        emit closed( this->objectName() );
        closeEvent->accept();
    }
};
#endif

请注意,对于我的问题,我需要一种方法来识别哪个子窗口用户正在关闭,而objectName为我工作。

答案 4 :(得分:0)

您可以创建基于QWidget的类,如:

class CloseWatcher : public QWidget
{
  Q_OBJECT

private:
  QString m_name;

signals:
  void disposing( QString name );

public
  CloseWatcher( QWidget * p )
    : QWidget( p )
    , m_name( p->objectName() )
  {}

  ~CloseWatcher()
  {
    emit disposing( m_name );
  }
};

并使用它:

// anywhere in code
QMdiSubWindow * wnd = getSomeWnd();
CloseWatcher * watcher = new CloseWatcher( wnd );

connect( watcher, SIGNAL( disposing( QString ) ), reveiver, SLOT( onDispose( QString ) ) );