QML ScrollView 的水平滚动条为何不可见且无法滚动?
数据小许
结论
只有当 ScrollView 的内容宽度超过视口宽度时,水平滚动条才有可滚动范围。示例中的 TextArea 宽度为 200,文本默认会换行,所以长文本仍可能被限制在视口宽度内,不会产生水平溢出。自定义水平滚动条要设置厚度,应使用 height,而不是 width: 8。
让内容产生水平溢出
将 TextArea 的 wrapMode 设为 TextEdit.NoWrap,文本就会保持单行并可横向滚动。可以先这样调整:
ScrollView {
width: 200
height: 200
ScrollBar.horizontal: ScrollBar {
policy: ScrollBar.AsNeeded
height: 8
background: Rectangle {
radius: 4
color: "transparent"
}
contentItem: Rectangle {
radius: 4
color: "green"
}
}
TextArea {
id: editor
implicitWidth: 200
wrapMode: TextEdit.NoWrap
text: "C++ (C Plus Plus) is a powerful, general-purpose, object-oriented programming language, an extension of the C language, known for its speed, efficiency, and low-level memory control, making it ideal for high-performance applications like operating systems, game engines, graphics, and resource-intensive software"
}
}
ScrollView 会管理通过 ScrollBar.horizontal 附加的滚动条的方向和位置,通常不需要手动设置 orientation 或 anchors。水平滚动条的厚度由 height 控制;原代码中的 width: 8 不能指定它的厚度。
检查滚动范围
设置 NoWrap 后如果仍不能横向滚动,请检查 ScrollView 实际获得的内容宽度是否大于视口宽度。implicitWidth: 200 与视口宽度相同,长文本能否让内容宽度扩展,取决于内容尺寸如何传递给滚动区域。必要时,可根据所用的 Qt 版本和布局,为内容项设置大于视口的宽度,或显式设置 ScrollView 的 contentWidth。
ScrollBar.AlwaysOn 只控制滚动条是否显示,不会让内容自动变得可滚动。调试时使用 ScrollBar.AsNeeded,更容易确认是否存在实际的水平滚动范围。宽度没有溢出时,即使滚动条可见,也没有可移动的距离。
备注:内容仅供参考。
