2012-01-11 4 views
3

Есть ли способ получить уведомление, когда пользователь закрывает QMdiSubWindow? Я не могу найти какой-либо сигнал в QMdiArea или в QMdiSubWindow, который предлагает мне.Qt: Как узнать, когда QMdiSubWindow закрыт?

Я думаю, что мой единственный шанс заключается в подклассе QMdiSubWindow и переопределении события close, но есть ли другой способ?

ответ

1

Я не думаю, что есть какой-либо другой способ, чем описывать (переопределяя событие закрытия), чтобы делать именно то, что вы просите.

Могут быть другие способы достижения того, чего вы хотите, не делая этого, в зависимости от того, почему вы хотите знать, когда он закрыт. Другими вариантами могут быть использование сигнала destroyed, проверка QApplication::focusWidget(), или, возможно, родительский контроль его children.

Редактировать в ответ на комментарий:

Сигналов и слоты отключаются автоматически при разрушении QObjects, и я хотел бы предложить, глядя на использование QSharedPointers или QScopedPointers для обработки вашего QObjects продолжительности жизни вместо этого. Применяя эти методы, вам не нужен сигнал из закрытого окна.

+0

Мне нужно очистить некоторые соединения между сигналами/слотами и удалить некоторые объекты. –

+0

Я просто хотел добавить, что использование сигнала 'destroy()' для доступа к QMdiSubWindow является опасным (т. Е. Подключить сигнал 'destroy()' к слоту, а затем в слоте передать 'sender()' в QMdiSubWindw), поскольку сигнал 'destroy()' испускается в деструкторе QObject. Это означает, что к тому времени, когда выдается сигнал 'destroy()', деструктор QMdiSubWindow уже вызван. – btse

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 делает работу для меня.

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))); 
1

Да, есть еще один способ: вы можете установить событие-фильтр на 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); 
} 
0

У меня была такая же проблема, но в моем случае задача была более конкретной: «Как скрыть подзаголовок, когда я нажимаю кнопку закрытия, а не закрываю». Поэтому я решил это со следующим:

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

Возможно, это не релевантный ответ, но он может быть полезен для кого-то.

Смежные вопросы