2011-09-11 24 views
5

我有一個QStackedWidget它持有幾頁充滿各種QLineEditQComboBox孩子。只要QStackedWidget不再有任何孩子有焦點(因爲一個孩子有焦點開始),我想發出一個信號。因此,從小孩到小孩不會發出信號,但是一旦在QStackedWidget之外選擇了小部件,就會發出信號。有關如何實施這個的任何建議?我看過InstallEventFilterQSignalMapper,但這兩個都不符合我的需求。任何意見,將不勝感激。發出信號,如果所有的兒童部件失去焦點

回答

2

這有點棘手。即使是從小孩到小孩的循環,在小孩失去焦點並在另一個小孩獲得焦點之前的一小段時間內,堆疊小工具的小孩都沒有焦點。雖然這個狀態非常短暫,但這是事實。

我能看到的唯一選擇是確定一個孩子小部件失去焦點和沒有孩子小部件獲得焦點之間的時間長度,你會認爲足夠長的時間來聲明確實沒有孩子小部件有焦點了。這將是一種類似於用來區分兩次單擊鼠標單擊的機制。

這可以通過在每個孩子註冊的父母中使用一個計時器和一個事件過濾器來實現,該過濾器會查找焦點進出事件。將定時器設置爲某個間隔(100毫秒?),並在收到焦點輸出事件時啓動它。如果在計時器仍在運行時收到焦點,請停止計時器。如果計時器完成,您可以觸發自己的信號來指示沒有任何子部件具有焦點。

+1

這工作完美,謝謝! – Jmbryan10

4

您可以連接到QApplication :: focusChanged信號,以評估相應插槽內的焦點小部件。清潔的方式來做到這一點是從QStackedWidget導出:

class StackedFocusWidget : public QStackedWidget { 

    Q_OBJECT 

public: 

    StackedFocusWidget(QWidget *parent = 0) : QStackedWidget(parent) { 
     connect(qApp, SIGNAL(focusChanged(QWidget *, QWidget *)), this, SLOT(onFocusChanged(QWidget *, QWidget *))); 
    } 

private slots: 

    void onFocusChanged(QWidget *old, QWidget *now) { 
     bool focusOld = old != 0 && isAncestorOf(old); 
     bool focusNow = now != 0 && isAncestorOf(now); 
     if (!focusOld && focusNow) { 
      emit gotFocus(); 
     } else if (focusOld && !focusNow) { 
      emit lostFocus(); 
     } 
    } 

signals: 

    void gotFocus(); 
    void lostFocus(); 
}; 

的信號StackedFocusWidget ::的GotFocus和StackedFocusWidget ::引發LostFocus將每當堆疊部件或它的任何兒童的的接收或失去焦點射出。