当用户关闭QMdiSubWindow时,有什么方法可以得到通知吗?我在QMdiArea或QMdiSubWindow中找不到任何暗示我可以的信号。
我认为我唯一的机会是通过继承QMdiSubWindow并覆盖close事件,但还有其他方法吗?
答案 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时,信号和插槽会自动断开连接,我建议您使用QSharedPointers或QScopedPointers来处理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 ) ) );