2013-02-14 55 views
5

我在QDockWidget內有QStackedWidge t - 取決於顯示哪個頁面我希望顯示/隱藏QDockWidget上的關閉按鈕。我可以通過使用QDockWidget::setFeatures()來做到這一點。如何捕獲QDockWidget關閉按鈕單擊事件

但是,我面臨的問題是如何捕捉關閉按鈕的信號,以便我可以更改停靠欄功能/設置堆疊的小部件頁面索引。

QDockWidget close button

我試圖使用事件過濾器:

class EventFilter : public QObject 
{ 
    Q_OBJECT 
public: 
    EventFilter(QObject* aParent); 
protected: 
    bool eventFilter(QObject *obj, QEvent *event); 
}; 

EventFilter::EventFilter(QObject* aParent) 
    : QObject(aParent) 
{ 

} 

bool EventFilter::eventFilter(QObject *obj, QEvent *event) 
{ 
    if (event->type() == QEvent::Close) 
    { 
     return true; 
    } 
    return QObject::eventFilter(obj, event); 
} 

並安裝它像這樣:

EventFilter* filter = new EventFilter(this); 
u->dockWidget_6->installEventFilter(filter); 

在我QMainWindow的構造 - 該eventFilter()方法沒打電話。

所以下次我試圖使用QDockWidget::visibilityChanged改變的信號,因爲它聽起來像這可能是我想要的東西:

connect(u->dockWidget_6, SIGNAL(visibilityChanged(bool)), SLOT(dockWindowClosed(bool))); 

此插槽沒有得到所謂的 - 但不是被點擊關閉按鈕時。

最後我試圖用升級的QDockWidget來捕獲QWidget::closeEvent()

class DockWidgetWithCloseSignal : public QDockWidget 
    { 
     Q_OBJECT 
    public: 
     explicit DockWidgetWithCloseSignal(const QString &title, QWidget *parent = 0, Qt::WindowFlags flags = 0) 
     : QDockWidget(title, parent, flags) 
    { 

    } 

    explicit DockWidgetWithCloseSignal(QWidget *parent = 0, Qt::WindowFlags flags = 0) 
: QDockWidget(parent, flags) 
    { 

    } 
protected: 
    void closeEvent(QCloseEvent *event) 
    { 
     event->ignore(); 
    } 
}; 

我看到的構造被稱爲這意味着確實正在使用這種新的小工具,但再次被點擊關閉按鈕時從來沒有所謂,因爲closeEvent()沒有喜悅。

回答

0

原來,除visibilityChanged信號之外的所有信號都能正常工作!

我向覆蓋的closeEvent()方法添加了一個信號,然後我可以連接到我想要的任何插槽。

實際的問題是,在堆疊的小部件中,我在另一頁上有另一個QDockWidget,因此我將所有這些東西都加到了錯誤的QDockWidget! (當然也提出了錯誤QDockWidget太!)。

希望這個問題可以作爲其他任何人的參考,需要弄清楚如何做到這一點 - 而不是爲什麼它不工作。

+0

我已經使用QObject :: destroyed()信號中描述的http://stackoverflow.com/questions/7091830/qt-destructor-call-for-closed-widget – vrogach 2015-04-28 14:00:44