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