SlideShare a Scribd company logo
Qt Quick – key events
2018/11/20
黃雲璘
Qt Quick 的keyboard focus
• 來源
– http://doc.qt.io/qt-5/qtquick-input-focus.html
• Qt Quick Key Interaction範例
– http://doc.qt.io/qt-5/qtquick-keyinteraction-
example.html
• 參考網頁
– https://stackoverflow.com/questions/43487731/f
orceactivefocus-vs-focus-true-in-qml
Qt Quick的keyboard focus -
相關properties與method
• Property:
– focus : bool
– activeFocus : bool [read-only]
• QML Type:
– FocusScope QML Type
• Method:
– forceActiveFocus() [overloaded function]
• 其他Property:
– activeFocusOnTab : bool
Qt Quick的keyboard focus -
properties
• focus : bool
• 在封閉的FocusScope(在同一個群組的概念)中是否具有
focus
• 如果為true,則這個群組獲得active focus時,此item將獲
得active focus
• activeFocus : bool [read-only]
• 指示此item是否具有active focus (由Qt裁決, 我們不能決
定)
• 如果activeFocus為true,則此item即是當前接收鍵盤輸入
的item,或者是當前接收鍵盤輸入的item的群組的源頭
(ancestor)
• 通常是藉由設定focus 以獲得activeFocus
=> 當一個群組(FocusScope) 裡有多個item都設為focus
時, Qt會決定哪一個item是activeFocus
Qt Quick的keyboard focus –
focus測試1
• 執行並按下Enter key的結果
Qt Quick的keyboard focus -
focus測試1
Qt Quick的keyboard focus -
focus測試2
執行並按下Enter key:
Qt Quick的keyboard focus -
FocusScope QML Type
• 為何需要FocusScope
– 對於非常簡單的狀況,僅設置focus屬性有時就足夠了。
但在可重複使用的組件(reusable components)被導入或
重複使用的復雜狀況下無法正確控制focus。
– Ex.
MyWidget.qml
.
.
focus: true
.
MainForm.qml
.
MyWidget {
}
MyWidget {
focus: true
}
.
.
可重複使用的組件
Qt Quick 的keyboard focus -
無法正確控制focus的驗證測試
執行結果:
MainForm.qml
MyWidget.qml
Qt Quick 的keyboard focus -
導入FocusScope的測試
修改MyWidget.qml :
執行結果
Qt Quick的keyboard focus -
FocusScope QML Type
• 在每個focus scope內,可將一
個object將Item :: focus設置為
true。 如果多個item都設置了
focus屬性,則設置focus的最後
一個type(或第一個)將具有focus
而其他則沒有設置,類似於沒
有focus scope時。
• 當focus scope接收到active focus
時,在其scope內中有設focus的
type(如果有)也會獲得active
focus。 如果此type也是
FocusScope,則代理行為將繼
續下去。 focus scope和子焦點
項(sub-focused item)都都將設置
activeFocus屬性。
MyWidget1 MyWidget2
MyWidget1 MyWidget2
Qt Quick的keyboard focus -
FocusScope QML Type
• Note: FocusScope不是視覺類型(visual type) (只是綁為群組的概
念),因此需要將其子項(Rectangle) 的屬性公開給FocusScope的
父項。 Layouts和positioning的類型將使用這些視覺(visual)和樣
式(styling)屬性來創建layout (也就是Colum)
MainForm.qml
• forceActiveFocus()
• forceActiveFocus(Qt::FocusReason reason)
– 強制active foucs該item
– 此方法將焦點設置在item上,並確保物件層次
結構中的所有源頭的FocusScope物件也被賦予
focus
– focus變化的原因是Qt :: OtherFocusReason。 使
用重載方法指定focus原因,以便更好地處理焦
點更改
Qt Quick的keyboard focus -
Method
Qt Quick的keyboard focus -
其他property
• activeFocusOnTab : bool
– 此屬性保存item是否想要包含於tab focus鏈(chain)
中. 默認情況下, 此參數設置為false
– tab focus chain會依序走訪元素 (先訪問parent, 然後
按其相關屬性的childen順序訪問子元素)
– 當按下Tab鍵, focus chain中某個item上的Tab鍵會將
鍵盤focus移動到chain中的下一個item
– 按BackTab (通常為Shift + Tab )會將focus移回上一個
item
– Keys或KeyNavigation使用的Tab key event 會比focus
chain的行為更優先; 若想要手動設置tab focus chain
可使用KeyNavigation
Qt Quick的keyboard focus
• 當QML Item明確地放棄focus時(經由設定: 當處於
active focus時將其focus屬性設置為false),系統不會
自動選擇另一種類型來獲得focus。 也就是說,可能
沒有任何active focus item
• Focus scope允許讓focus集中在一起(allocation)以輕鬆
畫分區域。 有一些QML item就是使用它來達到這個效
果
– Ex. ListView就是一個focus scope 。故ListView可以
focus當下的list item而不必擔心應用程序的其餘部
分會被影響。
– 所有QML view classes(如PathView和GridView)的
行為方式都相似於此

More Related Content

PDF
Storytelling For The Web: Integrate Storytelling in your Design Process
PDF
Artificial Intelligence, Data and Competition – SCHREPEL – June 2024 OECD dis...
PDF
How to Leverage AI to Boost Employee Wellness - Lydia Di Francesco - SocialHR...
PDF
2024 Trend Updates: What Really Works In SEO & Content Marketing
PPTX
ASP.Net MVC Framework
PPTX
Overview of Qt/QtQuick Testing, and Study for Qt GUI Automation Testing by Qt...
PPTX
Overview - QML and C++ Integration
PPTX
Overview - QML and C++ Integration
Storytelling For The Web: Integrate Storytelling in your Design Process
Artificial Intelligence, Data and Competition – SCHREPEL – June 2024 OECD dis...
How to Leverage AI to Boost Employee Wellness - Lydia Di Francesco - SocialHR...
2024 Trend Updates: What Really Works In SEO & Content Marketing
ASP.Net MVC Framework
Overview of Qt/QtQuick Testing, and Study for Qt GUI Automation Testing by Qt...
Overview - QML and C++ Integration
Overview - QML and C++ Integration
Ad

Qt Quick - Key events

  • 1. Qt Quick – key events 2018/11/20 黃雲璘
  • 2. Qt Quick 的keyboard focus • 來源 – http://doc.qt.io/qt-5/qtquick-input-focus.html • Qt Quick Key Interaction範例 – http://doc.qt.io/qt-5/qtquick-keyinteraction- example.html • 參考網頁 – https://stackoverflow.com/questions/43487731/f orceactivefocus-vs-focus-true-in-qml
  • 3. Qt Quick的keyboard focus - 相關properties與method • Property: – focus : bool – activeFocus : bool [read-only] • QML Type: – FocusScope QML Type • Method: – forceActiveFocus() [overloaded function] • 其他Property: – activeFocusOnTab : bool
  • 4. Qt Quick的keyboard focus - properties • focus : bool • 在封閉的FocusScope(在同一個群組的概念)中是否具有 focus • 如果為true,則這個群組獲得active focus時,此item將獲 得active focus • activeFocus : bool [read-only] • 指示此item是否具有active focus (由Qt裁決, 我們不能決 定) • 如果activeFocus為true,則此item即是當前接收鍵盤輸入 的item,或者是當前接收鍵盤輸入的item的群組的源頭 (ancestor) • 通常是藉由設定focus 以獲得activeFocus => 當一個群組(FocusScope) 裡有多個item都設為focus 時, Qt會決定哪一個item是activeFocus
  • 5. Qt Quick的keyboard focus – focus測試1
  • 6. • 執行並按下Enter key的結果 Qt Quick的keyboard focus - focus測試1
  • 7. Qt Quick的keyboard focus - focus測試2 執行並按下Enter key:
  • 8. Qt Quick的keyboard focus - FocusScope QML Type • 為何需要FocusScope – 對於非常簡單的狀況,僅設置focus屬性有時就足夠了。 但在可重複使用的組件(reusable components)被導入或 重複使用的復雜狀況下無法正確控制focus。 – Ex. MyWidget.qml . . focus: true . MainForm.qml . MyWidget { } MyWidget { focus: true } . . 可重複使用的組件
  • 9. Qt Quick 的keyboard focus - 無法正確控制focus的驗證測試 執行結果: MainForm.qml MyWidget.qml
  • 10. Qt Quick 的keyboard focus - 導入FocusScope的測試 修改MyWidget.qml : 執行結果
  • 11. Qt Quick的keyboard focus - FocusScope QML Type • 在每個focus scope內,可將一 個object將Item :: focus設置為 true。 如果多個item都設置了 focus屬性,則設置focus的最後 一個type(或第一個)將具有focus 而其他則沒有設置,類似於沒 有focus scope時。 • 當focus scope接收到active focus 時,在其scope內中有設focus的 type(如果有)也會獲得active focus。 如果此type也是 FocusScope,則代理行為將繼 續下去。 focus scope和子焦點 項(sub-focused item)都都將設置 activeFocus屬性。 MyWidget1 MyWidget2 MyWidget1 MyWidget2
  • 12. Qt Quick的keyboard focus - FocusScope QML Type • Note: FocusScope不是視覺類型(visual type) (只是綁為群組的概 念),因此需要將其子項(Rectangle) 的屬性公開給FocusScope的 父項。 Layouts和positioning的類型將使用這些視覺(visual)和樣 式(styling)屬性來創建layout (也就是Colum) MainForm.qml
  • 13. • forceActiveFocus() • forceActiveFocus(Qt::FocusReason reason) – 強制active foucs該item – 此方法將焦點設置在item上,並確保物件層次 結構中的所有源頭的FocusScope物件也被賦予 focus – focus變化的原因是Qt :: OtherFocusReason。 使 用重載方法指定focus原因,以便更好地處理焦 點更改 Qt Quick的keyboard focus - Method
  • 14. Qt Quick的keyboard focus - 其他property • activeFocusOnTab : bool – 此屬性保存item是否想要包含於tab focus鏈(chain) 中. 默認情況下, 此參數設置為false – tab focus chain會依序走訪元素 (先訪問parent, 然後 按其相關屬性的childen順序訪問子元素) – 當按下Tab鍵, focus chain中某個item上的Tab鍵會將 鍵盤focus移動到chain中的下一個item – 按BackTab (通常為Shift + Tab )會將focus移回上一個 item – Keys或KeyNavigation使用的Tab key event 會比focus chain的行為更優先; 若想要手動設置tab focus chain 可使用KeyNavigation
  • 15. Qt Quick的keyboard focus • 當QML Item明確地放棄focus時(經由設定: 當處於 active focus時將其focus屬性設置為false),系統不會 自動選擇另一種類型來獲得focus。 也就是說,可能 沒有任何active focus item • Focus scope允許讓focus集中在一起(allocation)以輕鬆 畫分區域。 有一些QML item就是使用它來達到這個效 果 – Ex. ListView就是一個focus scope 。故ListView可以 focus當下的list item而不必擔心應用程序的其餘部 分會被影響。 – 所有QML view classes(如PathView和GridView)的 行為方式都相似於此