有什麼方法可以在用戶關閉QMdiSubWindow時得到通知?我無法在QMdiArea中找到任何信號,也無法在QMdiSubWindow中找到任何暗示我可以的信號。Qt:如何知道QMdiSubWindow什麼時候關閉?
我想我唯一的機會是通過繼承QMdiSubWindow並重寫關閉事件,但有沒有其他方式?
有什麼方法可以在用戶關閉QMdiSubWindow時得到通知?我無法在QMdiArea中找到任何信號,也無法在QMdiSubWindow中找到任何暗示我可以的信號。Qt:如何知道QMdiSubWindow什麼時候關閉?
我想我唯一的機會是通過繼承QMdiSubWindow並重寫關閉事件,但有沒有其他方式?
我不認爲除了你所描述的(重寫關閉事件)之外,還有別的辦法來做你正在問的東西。
可能有其他的方式來實現你想要什麼,而不取決於你想知道它什麼時候關閉的原因。其他選項可能是使用destroyed信號,檢查QApplication::focusWidget(),或者可能讓父母檢查其children。
編輯迴應評論:
信號與插槽是在QObject對象的破壞自動斷開,並且我建議考慮使用QSharedPointers或QScopedPointers來處理你的QObject壽命來代替。通過應用這些技術,您不應該需要關閉窗口中的信號。
這是我結束編碼。
#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
注意,對於我的問題,我需要一種方法來確定哪些子窗口用戶關閉和對象名做的工作對我來說。
您可以創建基於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)));
是的,還有另一種方法:你可以在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);
}
我有同樣的麻煩,但在我的情況下,任務更具體:「當按下關閉按鈕而不是關閉時,如何隱藏子窗口」。所以,我解決了這個下列要求:
subwindow->setAttribute(Qt::WA_DeleteOnClose, false);
也許這不是一個相關的答案,但它可能是有用的人。
我需要清除信號/插槽之間的某些連接並刪除一些對象。 – 2012-01-11 11:45:00
我只是想補充一點,使用'destroy()'信號來訪問QMdiSubWindow是危險的(即將'destroyed()'信號連接到一個槽,然後在槽中將'sender()'投射到一個QMdiSubWindw ),因爲'destroy()'信號是在QObject的析構函數中發出的。這意味着在發出'destroy()'信號時,QMdiSubWindow的析構函數已經被調用。 – btse 2014-08-15 20:11:33