LINUX.ORG.RU

Как отключить «кинетическую» прокрутку?

 , ,


0

2

Имеется приложение на Qt5 + qml. В нем есть списки, которые надо листать и выбирать элементы - ну, ListView, понятное дело. И жутко бесит эта «кинетическая прокрутка» - когда ты прокручиваешь и отпускаешь - оно еще продолжает листаться с затуханием (и паршиво подлагивает). Я сперва пытался играться с опциями Flickable - там с velocity - все без толку. Тогда я собрал последнюю бету Qt 5.9 и подумал что мои проблемы решит появившийся там в контролах ScrollView. Хрен там, полоски прокрутки стали таскаться мышью, а в остальном нихрена не поменялось. Тогда я грохнул ListView и оставил в ScrollView просто Column с репитером и моделью. Но эта гадость - тоже листается кинетически (хотя ScrollView наследуется от Control и с Flickable ничего общего не имеет). Да, на планшете может быть это смотрелось бы круто, но по колесу прокрутки это выглядит ужасно. Кто-нибудь знает как это побороть?

★★

Ответ на: комментарий от fluorite

Я вот сейчас и пытаюсь костылить с MouseArea поверх ListView, и по onWheel перемещать contentY. Но тут нет ограничения по вверх/вниз, точнее с низом то просто - Math.max(0, y) - но с верхом я так нужный предел и не подобрал - там же кеширование элементов и нет фиксированной высоты, да и вообще выглядит костыльно. Я все же надеюсь, что есть «родной» способ.

wolph ★★
() автор топика
Ответ на: комментарий от CrossFire

Это я уже пробовал. После этого оно вообще листаться перестает. Но через костыль с onWheel я пока не подобрал верхнего предела для contentY.

contentItem.childrenRect.height - someListView.height
- не похоже на правду, по верху на треть экрана листается дальше чем нужно.

wolph ★★
() автор топика
Ответ на: комментарий от fluorite

Охренительный совет. Зачем тогда это Qt вообще нужен, если всё руками дописывать придётся? Можно сразу взять Cairo/skia и писать всё с нуля по-человечкски.

anonymous
()
Ответ на: комментарий от fluorite

Глянул код, это вроде как скроллбар, и непонятно как это отключит кинетическую прокрутку. А написать свой скроллбар и свою реализацию Flickable/ScrollView без кинетической прокрутки — разные задачи.

CrossFire ★★★★★
()
Последнее исправление: CrossFire (всего исправлений: 1)
Ответ на: комментарий от fluorite

Твое предложение - костыль, который надо принимать только в крайнем случае. Программист нужен, чтобы делать программы быстро и качественно. Свой костыль там, где можно и нужно делать библиотекой, таким решением как правило не является.

ncuxer
()
Ответ на: комментарий от CrossFire

Совсем разучились суть кода улавливать? Прокрутка и скроллбар делают одно и то же. Нет разницы, запилить «некинетический» скроллинг в ListView или скроллинг скроллбаром.

import QtQuick 2.6
import QtQuick.Window 2.2

Window {
    visible: true
    width: 640
    height: 480

    ListView {
        id: listView
        property int rowHeight: 100
        anchors.fill: parent
        model: 42
        delegate: Rectangle {
            width: parent.width; height: listView.rowHeight
            color: "red"
            border { color: "green"; width: 2 }

            Text {
                anchors.centerIn: parent
                text: index
            }
        }
    }

    MouseArea {
        property int lastY
        anchors.fill: listView

        onPressed: lastY = mouseY

        onPositionChanged: {
            if (pressedButtons == Qt.LeftButton) {
                var delta = mouseY < lastY ? listView.rowHeight : -listView.rowHeight
                listView.contentY = Math.min(Math.max(0, listView.contentHeight - listView.height),
                                             Math.max(0, listView.contentY - delta))
                lastY = mouseY
            }
        }
        onWheel: {
            var delta = wheel.angleDelta.y > 0 ? listView.rowHeight : -listView.rowHeight
            listView.contentY = Math.min(Math.max(0, listView.contentHeight - listView.height),
                                         Math.max(0, listView.contentY - delta))
        }
    }
}

fluorite ★★★★★
()
Последнее исправление: fluorite (всего исправлений: 2)
Ответ на: комментарий от fluorite

Да, конечно. А теперь, чтобы то, что ты наваял на коленке, работало как надо, добавь поддержку стрелочек, pg up/down, home/end, обработку фокуса. И протестируй это на различных экранах/конфигурациях/ОС. И еще с десяток нюансов в процессе обнаружится. И все это зачем? Убрать кинетический скролл! КОСТЫЛЬ!!!!

Я бы порекомендовал автору сделать патч для Qt и попытаться пропихнуть его в апстрим, если это так важно для него. Или использовать его локально и всё.

Хотя я бы забил, это не такая важная проблема, которая легко откладывается до лучших времен.

ncuxer
()
Ответ на: комментарий от ncuxer

Ты вообще к разработке хоть какое-то отношение имеешь? И как же по твоему работают твои стрелочки и клавиатурные сокращения для родного ListView?

fluorite ★★★★★
()

а эта кинетическая прокрутка, она в пятых кедах что ли? просто пятые кеды видел только на картинках, а тут возникла необходимость поставить на комп кеды, так вот если такая прокрутка в пятых, то пятые я юзать не буду

teod0r ★★★★★
()
Ответ на: комментарий от teod0r

Нет, эта кинетическая прокрутка - она в QtQuick (а в кедах на квике вроде только плазмоиды сделаны). Все обычные десктопные приложения - на обычных виджетах, с обычной прокруткой, а с сабжем они мутят свой фреймворк для десктопно-мобилочных приложений - Kirigami UI. Как там с ней - не знаю, когда попробовал ту версию киригами что в дистре - она была сырая до невообразимости и я решил ее еще некоторое время не трогать, а из софта на ней - вроде пытаются наваять магазин приложений.

wolph ★★
() автор топика
20 июня 2017 г.

Вроде, нашел.

Достаточно добавить на ListView что-то вроде

ScrollBar.vertical: ScrollBar {}
И вся «кинематичность» отваливается. Правда теперь проблема другая - листается слишком медленно и черепашьи. В Qt 5.9 появилось свойство stepSize, но походу это не то. Поскольку: - работает исключительно для методов increase/decrease - и вовсе задается в относительной величине, то есть на сколько пролистает - зависит от количества контента в списке.

wolph ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.