2011-10-28 58 views
12

我正在尋找類似QDialog的完成信號,僅適用於QWidget。原因是,一旦小部件彈出後我就禁用了我的工具欄(這根本不是問題),並且我希望工具欄在小部件關閉後再次啓用。需要類似QWidget的完成信號

我也無法重寫該小部件的close-Event,因爲那樣我們就會在業務類中擁有GUI代碼。

+1

從小部件發出信號?或者抓住'destroy()'信號? – RedX

+2

你的最後一行沒有意義。小部件是GUI項目,其關閉事件是GUI代碼。爲什麼重寫會導致GUI和業務邏輯的混合? – Mat

回答

14

您可以設置窗口小部件被關閉時刪除,然後聽其destroyed信號:

widget->setAttribute(Qt::WA_DeleteOnClose); 
connect(widget, SIGNAL(destroyed(QObject*)), this, SLOT(widgetDestroyed(QObject*))); 

這只是如果您對小部件內容不感興趣,則可以使用。在發射點destroyed()時,小工具不再是QWidget,而只是QObject(因爲destroyed()~QObject發出),所以您不能再將參數QObject*轉換爲QWidget

一個簡單的替代方案可能是將你的小部件包裝成QDialog

+0

第一個工作得很好,謝謝。 – LarissaGodzilla

+0

嗨,弗蘭克,我該如何實現'widgetDestroyed'插槽? – SexyBeast

+0

這取決於當小部件被銷燬時你想要做什麼,沒有通用的答案在插槽中做什麼。 –

0

QWidget實際上並沒有很多信號,根據文檔它總共有2個。但是,這並不意味着你不能自己指定一個信號並使用它,這可能是最好的方法。

9

在你的Widget類中,你可以添加自己的信號,其他人可以連接到。然後覆蓋closeEvent()方法。不要擔心壓倒這種方法,這種情況的確是正確的原因。

class MyCustomWidget: public QWidget 
{ 
    Q_OBJECT 

    ... 

    signals: 
     void WidgetClosed(); 

    protected: 

    //=============================================================== 
    // Summary: Overrides the Widget close event 
    // Allows local processing before the window is allowed to close. 
    //=============================================================== 
    void closeEvent(QCloseEvent *event); 

    } 

closeEvent方法觸發信號:

void MyCustomWidget::closeEvent(QCloseEvent *event) 
{ 
     emit WidgetClosed(); 
     event->accept(); 
} 
+0

我已經這樣做了,但由於某種原因,我可能沒有理解得和我想的一樣,我的團隊領導者並沒有這樣想。但是我會和他談談這件事,看到其他可能的方式讓事情變得不那麼重要。 – LarissaGodzilla