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