Добрый день.
Есть Flickable
и внутри его указано свойство ScrollBar.vertical
:
Flickable {
// ...
ScrollIndicator.vertical: ScrollIndicator {}
// ...
}
Все работает, но есть нюанс :-)
Если высота контента у Flickable требует полосы прокрутки, то она (полоса) появляется только в момент начала прокрутки, а в состоянии покоя полоса скрыта. После осуществления прокрутки полоса через пару секунд плавно исчезает.
Хочется, чтобы полоса, если высота контента ее требует, была видна всегда и не исчезала. Сразу предупрежу, что свойство ScrollBar.policy: ScrollBar.AlwaysOff
не совсем то, т.к. при этом полоса прокрутки становится видимой постоянно, даже в том случае, когда высота контента Flickable меньше высоты самого Flickable (а у ScrollIndicator в принципе нету свойства policy).
Если добавить такой код:
ScrollIndicator.vertical: ScrollIndicator {
contentItem.onOpacityChanged: {
console.log("contentItem.onOpacityChanged: " + contentItem.opacity)
}
}
то можно увидеть, что исчезновение организовано методом постепенной смены contentItem.opacity
.
По информации отсюда https://stackoverflow.com/a/42203178
можно использовать вот такие хаки, чтобы добиться постоянной видимости у ScrollBar или ScrollIndicator:
Вариант 0
Flickable {
// ...
ScrollIndicator.vertical: ScrollIndicator {
contentItem.opacity: 1.0
contentItem.onOpacityChanged: {
contentItem.opacity = 1.0
// Можно раскомментировать данную строку и убедиться,
// что в процессе работы меняется именно contentItem.opacity
// (предварительно нужно закомментировать установку contentItem.opacity выше)
// console.log("contentItem.onOpacityChanged: " + contentItem.opacity)
}
}
// ...
}
Вариант 1
Flickable {
// ...
ScrollIndicator.vertical: ScrollIndicator {
active: true
onActiveChanged: {
active = true
// Можно раскомментировать данную строку и убедиться,
// что в процессе работы меняется именно onActiveChanged
// (предварительно нужно закомментировать установку onActiveChanged выше)
// console.log("onActiveChanged " + active)
}
}
// ...
}
Это конечно работает, но согласитесь, это все таки некрасиво: ведь какой-то обработчик там внутри все же срабатывает и еще таймер запускает для постепенной смены прозрачности. Может кто-нибудь знает более умное решение?
А да, что вообще думаете про такое поведение скролбара с автоскрытием? Может и хрен с ним? На смартфоне так практически во всех приложениях и работает (но в некоторых приложениях при первом отображении области со скролбаром он на секунду отображается, потом снова пропадает).
Вот вариант, при котором полоса прокрутки отображается сразу после загрузки qml сцены, затем через несколько секунд исчезает:
Flickable {
// ...
ScrollIndicator.vertical: ScrollIndicator {
active: true
Component.onCompleted: {
active = false
}
}
// ...
}
Pavval, милости прошу на обсуждение.