如何在 Kirigami ScrollablePage 中使用箭头键滚动?

Posted

技术标签:

【中文标题】如何在 Kirigami ScrollablePage 中使用箭头键滚动?【英文标题】:How to scroll with arrow keys in a Kirigami ScrollablePage? 【发布时间】:2020-07-11 19:49:32 【问题描述】:

基于 Qt QML 的移动/桌面融合 UI 框架 Kirigami 提供 QML 类型 ScrollablePage 以支持滚动内容。如果它大于 ScrollablePage 本身,则将任何可视 QML 项放入其中会自动使其可滚动:

ScrollablePage 是一个包含可滚动内容的 Page,例如 ListViews。

滚动和滚动指示器将被自动管理。

Kirigami.ScrollablePage 
    id: root
    //The rectangle will automatically be scrollable
    Rectangle 
        width: root.width
        height: 99999
    

(source)

这提供了滚动条,并允许使用鼠标滚轮滚动、使用触摸板进行两指滚动以及轻弹(“单击并抛出”)滚动,就像我们在触摸屏设备上习惯的那样。

但是,它不允许使用任何键盘键(向上/向下箭头、向上/向下翻页)滚动。我怎样才能做到这一点?执行 Keys.onUpPressed: scrollBar.decrease() 的 usual approach 不起作用,因为 ScrollablePage 的滚动条不能作为其公共 API 的一部分访问。

【问题讨论】:

【参考方案1】:

说明

使用Flickable 包装您放入ScrollablePage 的内容项。然后评估Flickable 中的按键事件并作为响应执行flick() 以滚动视图。示例(结合示例from the Kirigami manual 和from the Qt manual):

Kirigami.ScrollablePage 
    id: root

    Flickable 
        focus: true
        topMargin: 20; leftMargin: 20; bottomMargin: 20; rightMargin: 20

        Keys.onUpPressed:   flick(0,  800)
        Keys.onDownPressed: flick(0, -800)

        Rectangle 
            width: root.width
            height: 5000
        
    

详细说明

虽然您无法访问滚动条,但您可以访问滚动条用于移动视图的内容:Flickable 实例。你只需要把它包裹在页面的内容上。如果你不这样做,ScrollablePage 无论如何都会在内部使用 ScrollView 到 wrap your page's content in a Flickable,但是你没有引用它来执行 flick()

执行flick()与用户滑动元素时相同,所以滚动条位置等都会更新好。

如果它仍然不起作用,那么 (1) 可能您给 Flickable::flick() 提供的像素/秒值太小以至于滚动不可见,或者 (2) 可能您平台上的初始 Flickable::flickDeceleration 值搞砸了。这些值是特定于平台的,因此可能需要一些实验。在某些平台上,在 flick() will help 期间将它们设置为零,而在 Linux 下,这正是防止任何滚动移动的值。

上述解决方案无需启用ScrollablePage::keyboardNavigationEnabled,因为这仅用于使用箭头键(见下文)移动合适内容的currentItem,而不用于一般滚动。如果您的页面内容是项目视图(ListViewGridView 等),它甚至会阻止普通滚动。

项目视图的替代解决方案

如果 ScrollablePage 的内容是项目视图(任何具有 currentItem 属性的 QML 对象,例如 ListViewGridView),那么不要将该内容包装在 Flickable 中,只需启用 @ 987654328@。它允许您使用向上箭头键和向下箭头键移动currentItem。这就是人们通常想要的这些视图,即使它不是滚动而是键盘导航。

【讨论】:

以上是关于如何在 Kirigami ScrollablePage 中使用箭头键滚动?的主要内容,如果未能解决你的问题,请参考以下文章

在QGIS中如何添加天地图的WMTS

如何在表单提交后保留文本(如何在提交后不删除自身?)

如何在异步任务中调用意图?或者如何在 onPostExecute 中开始新的活动?

在 Avkit 中如何使用这三行代码,以及如何将音乐静音”

如何在 JDBC 中启动事务?

如何在 Fragment 中调用 OnActivityResult 以及它是如何工作的?