Qt應用 鍵盤聚焦
Qt應用 鍵盤聚焦是本文介紹的內容,關于鍵盤的更多內容,請參考本文末尾。Qt的部件按照GUI設計中的慣例來處理鍵盤聚焦。
基本的問題就是,用戶的擊鍵動作能夠直接聚焦在屏幕上的任意窗口,或者是內嵌在特定窗口的任意部件上。當用戶按下一個鍵時,他們期望焦點在他們期望的位置,軟件必須要滿足這個需求。系統(tǒng)必須要決斷擊鍵動作直接聚焦在哪個應用程序,應用程序的哪個窗口,窗口的哪個部件。
聚焦動作
將鍵盤焦點聚集在一個特定的部件上的慣例有以下幾種:
1、用戶按下Tab(或者Shift+Tab)
2、用戶點擊一個部件
3、用戶按下一個鍵盤快捷鍵
4、用戶使用鼠標滾輪
5、用戶把焦點移動到一個窗口,這時應用程序必須決定窗口的哪個部件應該獲得焦點
以上這些動作機制是不同的,這些動作之中,會有不同的部件接收到焦點。下面將依次介紹:
Tab 或者 Shift+Tab
按下Tab鍵是使用鍵盤移動焦點最常用的方式。(有時在數(shù)據(jù)錄入型應用程序中Enter的作用和Tab鍵一樣;在Qt中通過一個event filter很容易實現(xiàn))
在常用的所有窗口系統(tǒng)中按下Tab鍵,每個窗口都有一個包含了其上所有部件的循環(huán)列表,焦點會切換到這個列表的下一個部件。Tab鍵會按照循環(huán)列表的一個方向切換焦點,而Shift+Tab按照相反的方向切換。按下Tab鍵后在部件之間切換的順序被稱為tab順序。
你可以使用QWidget::setTabOrder()來定制tab順序。(如果你不這樣做,Tab通常會以部件創(chuàng)建的順序切換焦點)Qt Designer提供一種可視化的方式來改變tab順序。
因為按下Tab鍵非常常用,大部分可以獲得焦點的部件都支持tab聚焦。有些罕見的部件是個例外,他們通過一些鍵盤加速器或者錯誤(keyboard accelerator or error)來切換焦點。
舉個例子,在一個數(shù)據(jù)錄入型對話框中,有一個只有在百分之一的情況下才必要的區(qū)域。在這樣的對話框中,Tab鍵就會跳過這個區(qū)域,對話框可以使用以下機制:
1、如果程序可以決定這個區(qū)域是否需要,它可以在用戶完成錄入按下OK鍵,或者當用戶完成其它區(qū)域的錄入之后按下Enter,把焦點切換到那里?;蛘撸瑢⒋藚^(qū)域包含在tab順序中但將它禁用。當用戶已經(jīng)設置完其它的區(qū)域,該區(qū)域變得比較適合時,再啟用它。
2、此區(qū)域上的標簽可以包括一個鍵盤快捷鍵,以使焦點可以切換到此區(qū)域上。
關于Tab支持的另外一種例外是必須支持tab插入的文本錄入型部件;幾乎所有的文本編輯器都屬于這一類。Qt把Ctrl+Tab當做Tab,Ctrl+Shift+Tab當做Shift+Tab,這些部件可以重新實現(xiàn)QWidget::event()函數(shù),在調用QWidget::event()完成所有其它按鍵的正常處理之前處理Tab.然而,因為一些系統(tǒng)將Ctrl+Tab用作其它的用途,用戶因此可能不知道Ctrl+Tab,總的來說并沒有一種完全的解決辦法。
用戶點擊部件
這可能是在使用鼠標或者其它點式設備的電腦上比Tab鍵更常見的聚焦方式。
通過點擊來切換焦點比Tab更強大一些。當把焦點移動到某一個部件時,對于編輯型部件而言,文本的光標(部件內部焦點)也會移動到了鼠標點擊的位置點上。
由于這種方式如此的常見,用戶很習慣這種方式,自然而然的應該是大部分部件都支持這種方式。然而,也存在一些需要的理由要規(guī)避這種方式:比如用戶可能不想從當前焦點所在的部件上移除焦點。
舉例來說,再一個文本編輯器中,當用戶點擊‘B’(粗體)功能按鈕,鍵盤焦點應該怎么應對?是應該保留在它所在的位置,一般來說這個時候肯定是在編輯文本當中,還是將焦點移動到‘B’按鈕處?
我們建議支持文本錄入的部件同時支持點擊聚焦,為了避免上述情況鼠標點擊在不同的情況下會承擔不同的作用。(對于按鈕來說,我們推薦添加鍵盤快捷鍵,QAbstractButton及其子類可以很容易實現(xiàn))
在Qt中,只有QWidget::setFocusPolicy()函數(shù)會影響點擊聚焦。
用戶按下鍵盤快捷鍵
通過鍵盤快捷鍵來切換焦點不是很常見。在打開模態(tài)對話框時會隱式發(fā)生,但是如果使用諸如QLabel::setBuddy(),QGroupBox,QTabBar提供的焦點加速器時會明確的發(fā)生。
我們建議用戶想要跳轉的所有部件都支持快捷鍵聚焦。舉例來說,一個標簽對話框可以為每個頁面設置鍵盤快捷鍵,因此用戶可以按下比如Alt+P快捷鍵來跳轉到打印頁面。但是按鍵總共就只有那么多,所以為命令提供鍵盤快捷鍵顯得很重要。Alt+P也可以用作粘貼、播放、打印的快捷鍵,比如在Standard Accelerator Keys列表中就這樣用。
用戶滾動鼠標滾輪
在微軟Windows操作系統(tǒng)中,鼠標滾輪往往是由具有鍵盤焦點的部件來處理。在Mac OS X和X11中,則是由獲得其它鼠標事件的部件來處理。
Qt處理這種平臺差異性的方法是當使用滾輪時讓部件切換鍵盤焦點。應用程序遵循每個部件上的正確的聚焦策略,應用程序就可以以慣用的方式在Windows,Mac OS X,和X11平臺上正確的運行。
用戶把焦點移動到窗口
在這種情況下,應用程序必須決定窗口內的哪個部件獲得焦點。
這可能很簡單,如果焦點之前已經(jīng)在該窗口上,之前獲得焦點的***一個部件會重新獲得焦點。Qt可以自動實現(xiàn)。
如果焦點之前從沒有聚焦到該窗口上,而且你知道焦點應該開始于哪里,在調用QWidget::show()之前調用某部件上的QWidget::setFocus(),該部件就會獲得焦點。如果不這樣做,Qt會挑選一個合適的部件來使它獲得焦點。
小結:關于Qt應用 鍵盤聚焦的內容到這里就介紹完了,希望本文能對你有所幫助。更多相關 內容請參考編輯推薦。