Qt的窗口部件在圖形用戶界面中按用戶的習慣的方式來處理鍵盤焦點。基本出發點是用戶的擊鍵能定向到屏幕上窗口中的任何一個,和在窗口中任何一個部件中。當用戶按下一個鍵,他們期望鍵盤焦點能夠到達正確的位置,並且軟件必須盡量滿足這種希望。系統必須確定擊鍵定位在哪一個應用程序、應用程序中的哪一個窗口和窗口中的哪一個窗口部件。
1、焦點移動的方式
把焦點定位特殊的窗口部件的習慣方式有:
(1)用戶按下Tab鍵(或者Shift鍵+Tab鍵)(或者有時是Enter鍵)。
(2)用戶點擊一個窗口部件。
(3)用戶按下一個鍵盤快捷鍵。
(4)用戶使用鼠標滾輪。
(5)用戶移動焦點到一個窗口,並且應用程序必須決定窗口中的哪個窗口部件應該得到焦點。
這些移動機制的每個都是不同的,並且不同類型的窗口部件只能接收它們中的一些方式的焦點。下面我們將按次序介紹它們。
(1)Tab或者Shift+Tab.
按Tab鍵是到目前為止用鍵盤移動焦點的最通用的方法。有時在輸入數據的應用程序中Enter鍵和Tab鍵的作用是一樣的。我們暫時忽略這一點。
所有窗口系統中的有關焦點的最通用使用方法是:按Tab鍵移動鍵盤焦點到每個窗口的窗口部件循環列表中的下一個窗口部件。Tab鍵按照循環列表的一個方向移動焦點,Shift鍵+Tab鍵按另一個方向移動焦點。按Tab鍵從一個窗口部件到下一個窗口部件移動焦點的次序叫做Tab鍵次序。
在Qt中,窗口部件循環列表存放在QFocusData類中。每個窗口有一個QFocusData對象,並且當選擇合適的 QWidget::FocusPolicy焦點策略的QWidget::setFocusPolicy()被調用的時候,窗口部件自動把它們自己追加到列表的末尾。你可以使用QWidget::setTabOrder()來自定義Tab鍵控制次序。如果你沒有定義這個次序,那么Tab鍵會按照窗口部件構造的順序移動焦點。Qt designer工具提供了一個可視化的改變Tab鍵控制次序的方法。
因為按Tab鍵是如此的常用,大多數含有焦點的窗口部件應該支持Tab焦點。主要例外情況是幾乎沒用到的窗口部件,並且在窗口部件上有一些移動焦點的鍵盤快捷鍵或者錯誤處理。
(2)用戶點擊一個窗口部件。
在使用鼠標或者其它指針設備的計算機中,用鼠標點擊一個窗口部件是一種比按Tab鍵更常用的方法。
當鼠標點擊把焦點移到一個窗口部件時,對於編輯器窗口部件,它也會移動文本光標(窗口部件的內部焦點)到鼠標被點擊的地點。
鼠標點擊移動焦點是大多數窗口部件必須支持的,有時窗口部件需要避免鼠標點擊移動焦點。例如:在一個字處理程序中,當用戶點擊"B"(粗體)工具按鈕,鍵盤焦點應該保留在原來的位置。在Qt中,只有QWidget::setFocusPolicy()函數影響點擊焦點。
(3)用戶按下一個鍵盤快捷鍵。
使用鍵盤快捷鍵來移動焦點不是很常用。這種情況可能會隱含地發生在打開的模式對話框中,但是也會顯式地發生在使用焦點加速器中,例如在QLabel::setBuddy()、QGroupBox和QTabBar提供的加速器中。
用戶想讓焦點跳到的窗口部件都應支持快捷鍵焦點。例如:一個Tab對話框為它的每一個頁提供鍵盤快捷鍵,所以用戶可以按下比如Alt+P來跳到打印頁面。但只能有少量的快捷鍵,並且為命令提供鍵盤快捷鍵也很重要,如:在標准快捷鍵列表中,Alt+P也可以用來粘貼、播放或打印。
(4)用戶使用鼠標滾輪。
在Microsoft Windows上,鼠標滾輪的用法是一直由有鍵盤焦點的窗口部件處理。在Mac OS X和X11上,它由獲得其它鼠標事件的窗口部件處理。
Qt處理這種平台差異的方法是當滾輪被使用時,讓窗口部件移動鍵盤焦點。每個窗口部件上有合適的焦點策略,應用程序可以在Windows、Mac OS X和X11上按照習慣正確地處理焦點。
(5)用戶移動焦點到這個窗口。
在這種情況下,應用程序必須決定窗口中的哪一個窗口部件接收焦點。Qt自動實現這樣的做法:如果焦點以前在這個窗口中,那么窗口中有焦點的最后一個窗口部件應該重新獲得焦點。如果以前焦點就從來沒有來到過這個窗口,並且你知道焦點應該從哪里開始,就在你調用QWidget::show()顯示它之前,在應該接收焦點的窗口部件上調用QWidget::setFocus()。如果你不知道,Qt會選擇一個合適的窗口部件。
2、焦點策略及操作函數
鍵盤焦點的策略及操作函數說明如下:
(1)焦點策略屬性變量
focusPolicy 焦點策略屬性變量保存的是窗口部件接收鍵盤焦點的策略。如果窗口部件通過tab來接收鍵盤焦點,這個策略就是QWidget::TabFocus;如果窗口部件通過點擊來接收鍵盤焦點,這個策略就是QWidget::ClickFocus;如果窗口部件上述兩種方式都使用,是 QWidget::StrongFocus;並且如果它不接收焦點(QWidget的默認值),是QWidget::NoFocus。
如果一個窗口部件處理鍵盤事件,你必須使鍵盤焦點生效。這通常在窗口部件的構造函數中完成。例如,QLineEdit的構造函數調用setFocusPolicy(QWidget::StrongFocus)。
(2)void QWidget::setFocus() [虛槽]
函數setFocus()把鍵盤輸入焦點賦給這個窗口部件(或者它的焦點代理)。
首先,一個焦點移出事件會被發送給焦點窗口部件(如果有的話)告訴它關於失去焦點的事情。然后一個焦點進入事件被發送給這個窗口部件告訴它剛剛接收到焦點。(如果焦點移出和進入的窗口部件是同一個的話,就什么都沒有發生。)
函數setFocus()會把焦點給一個窗口部件,而不管它的焦點策略,但是不會清空任何鍵盤捕獲(grabKeyboard())。請注意如果窗口部件是被隱藏的,它將不接收焦點。
(3)void QWidget::setFocusProxy(QWidget * w) [虛]
函數setFocusProxy設置這個窗口部件的焦點代理為窗口部件w。如果w為0,這個函數重置這個窗口部件沒有焦點代理。
一些窗口部件,比如QComboBox,能夠"擁有焦點",但創建一個子窗口部件來實際處理這個焦點。例如,QComboBox創建了一個QLineEdit來處理焦點。
當"這個窗口部件"獲得焦點時,setFocusProxy()設置的這個窗口部件實際獲得焦點。如果有了一個焦點代理,focusPolicy()、setFocusPolicy()、setFocus()和hasFocus()都在這個焦點代理上操作。
小結:QT核心編程之鍵盤焦點的內容介紹完了,希望本文對你有所幫助,如果需要參考更多的內容,請看編輯推薦
https://blog.csdn.net/nowayings/article/details/38729785