linuxFb平台QML ListView按键自动重复功能失效求助
QML ListView按键长按导航失效(linuxfb平台)
问题现象
开发的QML应用在Linux桌面xcb平台运行时,ListView启用keyNavigationEnabled: true后,长按上下键可正常滚动;但切换到linuxfb平台,长按仅能从第一个条目切换到第二个,按键自动重复功能失效。
示例代码
Main.qml
//Main.qml import QtQuick import QtQuick.Window Window { width: 480 height: 272 visible: true title: qsTr("Hello World") Rectangle { width: 180 height: 40 Component { id: contactDelegate Item { width: 180 height:40 Column { Text {text: '<b>Name:</b>' + name} Text {text: '<b>Name:</b>' + number} } } } ListView { width: 180 height: 200 keyNavigationEnabled: true Component.OnCompleted: itemAtIndex(0).forceActiveFocus() model: ContactModel{} delegate: contactDelegate highlight: Rectangle { color: "lightsteelblue" radius: 5 } focus: true } } }
ContactModel.qml
//ContactModel.qml import QtQuick ListModel { ListElement { name: "Bill Smith" number: "555 3264" } ListElement { name: "Bill Smith" number: "555 3264" } ListElement { name: "John Brown" number: "111 2222" } ListElement { name: "Sam Wise" number: "555 0473" } ListElement { name: "Eric Flag" number: "333 0473" } ListElement { name: "Max Van" number: "444 0473" } }
linuxfb启动命令
QT_QPA_FB_DISABLE_INPUT=1 QT_QPA_EVDEV_KEYBOARD_PARAMETERS=/dev/input/event7 QT_QPA_EVDEV_MOUSE_PARAMETERS=/dev/input/event7:nocompress:abs QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/event7 QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0:size=480x272 QT_QPA_GENERIC_PLUGINS=evdevmouse,evdevkeyboard,evdevtouch QWS_MOUSE_PROTO=/dev/input/event7 ./myapp
解决思路
配置evdev键盘按键重复参数
linuxfb平台依赖evdev处理输入,默认可能未启用按键自动重复。修改QT_QPA_EVDEV_KEYBOARD_PARAMETERS,添加重复启用开关及速率配置:QT_QPA_EVDEV_KEYBOARD_PARAMETERS=/dev/input/event7:repeat:on:repeat-delay=500:repeat-rate=30其中
repeat-delay是首次重复前的延迟(单位ms),repeat-rate是后续重复的间隔速率(单位ms),可根据需求调整。手动实现ListView长按滚动逻辑
若evdev层面配置无效,可在QML中通过Timer和按键事件手动处理:ListView { // 原有属性保留 focus: true property bool keyUpPressed: false property bool keyDownPressed: false Timer { id: scrollTimer interval: 100 repeat: true onTriggered: { if (keyUpPressed && currentIndex > 0) currentIndex-- else if (keyDownPressed && currentIndex < count - 1) currentIndex++ } } Keys.onPressed: { if (event.key === Qt.Key_Up) { keyUpPressed = true if (!scrollTimer.running) { currentIndex-- scrollTimer.start() } event.accepted = true } else if (event.key === Qt.Key_Down) { keyDownPressed = true if (!scrollTimer.running) { currentIndex++ scrollTimer.start() } event.accepted = true } } Keys.onReleased: { if (event.key === Qt.Key_Up) { keyUpPressed = false if (!keyDownPressed) scrollTimer.stop() event.accepted = true } else if (event.key === Qt.Key_Down) { keyDownPressed = false if (!keyUpPressed) scrollTimer.stop() event.accepted = true } } }排查输入设备冲突
启动命令中同一event设备同时绑定键盘、鼠标、触摸屏,可能引发事件冲突。通过cat /proc/bus/input/devices确认各输入设备对应的节点,给键盘分配独立的正确设备节点。升级Qt版本或检查平台特性支持
部分旧版Qt在linuxfb平台对按键重复的支持存在缺陷,尝试升级至Qt 6.2及以上版本,或查阅Qt官方文档确认linuxfb平台的输入处理特性差异。
内容的提问来源于stack exchange,提问作者Tiger35
相关产品推荐
相关产品推荐

