我有一個QStackedWidget
它持有幾頁充滿各種QLineEdit
和QComboBox
孩子。只要QStackedWidget
不再有任何孩子有焦點(因爲一個孩子有焦點開始),我想發出一個信號。因此,從小孩到小孩不會發出信號,但是一旦在QStackedWidget
之外選擇了小部件,就會發出信號。有關如何實施這個的任何建議?我看過InstallEventFilter
和QSignalMapper
,但這兩個都不符合我的需求。任何意見,將不勝感激。發出信號,如果所有的兒童部件失去焦點
5
A
回答
2
這有點棘手。即使是從小孩到小孩的循環,在小孩失去焦點並在另一個小孩獲得焦點之前的一小段時間內,堆疊小工具的小孩都沒有焦點。雖然這個狀態非常短暫,但這是事實。
我能看到的唯一選擇是確定一個孩子小部件失去焦點和沒有孩子小部件獲得焦點之間的時間長度,你會認爲足夠長的時間來聲明確實沒有孩子小部件有焦點了。這將是一種類似於用來區分兩次單擊鼠標單擊的機制。
這可以通過在每個孩子註冊的父母中使用一個計時器和一個事件過濾器來實現,該過濾器會查找焦點進出事件。將定時器設置爲某個間隔(100毫秒?),並在收到焦點輸出事件時啓動它。如果在計時器仍在運行時收到焦點,請停止計時器。如果計時器完成,您可以觸發自己的信號來指示沒有任何子部件具有焦點。
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將每當堆疊部件或它的任何兒童的的接收或失去焦點射出。
相關問題
- 1. 防止LostFocus在兒童元素失去焦點時被觸發
- 2. 單擊兒童時如何不失去元素焦點
- 3. Android的GridView焦點發布兒童?
- 4. 黑莓漿果有焦點和失去焦點的事件嗎?
- 5. 滾動失敗,如果點擊兒童
- 6. 禁用所有控件後,WinForms窗體部分失去焦點
- 7. PropertyGrid部隊失去焦點
- 8. 按TAB鍵失去焦點部件
- 9. 沒有失去焦點事件jQuery的
- 10. 沒有失去焦點
- 11. Flex:失去組件焦點
- 12. jQuery失去焦點事件
- 13. UITextField失去焦點事件
- 14. 點擊外部edittext以失去焦點
- 15. 小工具失去焦點時的信號是什麼?
- 16. 兒童內部角兒童
- 17. 有沒有辦法讓s tkinter小部件失去焦點?
- 18. 滾動查看兒童的滾動時丟失焦點
- 19. 兒童失去其弱引用父
- 20. UIGestureRecognizer「失去焦點」?
- 21. Flex:ItemEditor失去焦點!
- 22. 層失去焦點
- 23. java - 失去焦點
- 24. UISearchBar失去焦點
- 25. TextBox失去焦點
- 26. Ultraoptionset失去焦點
- 27. 如何查找ASTNode的所有子節點(兒童和兒童孩子)
- 28. Android Expandable列表查看兒童焦點
- 29. 與焦點獲取兒童內NSSplitView
- 30. 失去焦點發布的Visual Studio 2013
這工作完美,謝謝! – Jmbryan10