2012-01-11 48 views

回答

1

我不認爲除了你所描述的(重寫關閉事件)之外,還有別的辦法來做你正在問的東西。

可能有其他的方式來實現你想要什麼,而不取決於你想知道它什麼時候關閉的原因。其他選項可能是使用destroyed信號,檢查QApplication::focusWidget(),或者可能讓父母檢查其children

編輯迴應評論:

信號與插槽是在QObject對象的破壞自動斷開,並且我建議考慮使用QSharedPointersQScopedPointers來處理你的QObject壽命來代替。通過應用這些技術,您不應該需要關閉窗口中的信號。

+0

我需要清除信號/插槽之間的某些連接並刪除一些對象。 – 2012-01-11 11:45:00

+0

我只是想補充一點,使用'destroy()'信號來訪問QMdiSubWindow是危險的(即將'destroyed()'信號連接到一個槽,然後在槽中將'sender()'投射到一個QMdiSubWindw ),因爲'destroy()'信號是在QObject的析構函數中發出的。這意味着在發出'destroy()'信號時,QMdiSubWindow的析構函數已經被調用。 – btse 2014-08-15 20:11:33

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 

注意,對於我的問題,我需要一種方法來確定哪些子窗口用戶關閉和對象名做的工作對我來說。

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

也許這不是一個相關的答案,但它可能是有用的人。

相關問題