TestCase mouseDrag только щелкает элемент внутри Flickable, но не перетаскивает - PullRequest
0 голосов
/ 06 апреля 2020

В QML TestCase я пытаюсь настроить автоматическую c прокрутку ListView, который содержится внутри Flickable (чтобы добавить пользовательский нижний колонтитул, который можно щелкнуть в представлении, чего не произойдет, если просто * 1001) *)

Однако mouseDrag только щелкает правильную координату, но не перетаскивает ее в каком-либо направлении. Вот упрощенная версия, максимально приближенная к реальной:

Practice.qml

import QtQuick 2.5

FocusScope {
    width: 1920
    height: 1080

    Flickable {
        objectName: 'flickableList'
        boundsBehavior: Flickable.StopAtBounds
        clip: true
        width: parent.width
        height: 240
        contentHeight: 500

        ListView {
            interactive: false
            height: parent.height
            width: parent.width

            model: ['example1', 'example2', 'example3', 'example4', 'example5']
            delegate: Item {
                width: 300
                height: 100
                Text {
                    text: modelData
                }
            }
        }
    }

    Item {
        id: footer
        height: 100
        width: parent.width
    }
}

TheTest.qml

// The relevant part
var theList = findChild(getView(), 'flickableList')
var startY = 220
var endY = 20
mouseDrag(theList, 100, startY, 100, endY, Qt.LeftButton, Qt.NoModifier, 100)

Итак, когда я просматриваю тестовый пользовательский интерфейс, я вижу, что он четко щелкает по нужному делегату (в реальной реализации он выделен фокусом), ie. третий элемент "example3", который начинается с Y 200 и заканчивается Y 300). Но событие перетаскивания никогда не происходит. На экране ничего не движется, и compare(theList.contentY, 200) говорит, что он все еще находится в позиции 0. Я ожидал бы, что он будет на 200, поскольку мышь должна mouseDrag двигаться из положения 220 в 20, ie. прокрутить список вниз на 200. И 220 также находится в пределах видимой высоты (240).

Просто чтобы быть уверенным, я также изменил значения Y, но также не двигался:

var theList = findChild(getView(), 'flickableList')
var startY = 20
var endY = 220
mouseDrag(theList, 100, startY, 100, endY, Qt.LeftButton, Qt.NoModifier, 100)

Также, так как на 3-й элемент явно нажимается (он выделяется), переданный элемент theList (= Flickable) должен быть действительным.

Edit: Да, и это прокручивает список, но он идет вплоть до самого конца списка (388 пикселей вниз в реальной реализации, даже если дельта составляет всего 30 пикселей):

mousePress(theList, startX, startY)
mouseMove(theList, endX, endY)
mouseRelease(theList, endX, endY)

Итак, вопрос:

mouseDrag работает только для определенных типов c компонентов (ie. Не работает на Flickable?) Или что-то не хватает? Как я могу получить его, чтобы прокрутить список вниз? Спасибо!

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

Ваш тег говорит, что вы используете Qt 5.5 - я бы порекомендовал попробовать Qt 5.14, если это возможно, поскольку было исправление, которое могло бы помочь:

mouseDrag (): убедитесь, что промежуточные ходы выполнены для всех перетаскиваний

[...]

На практике это означает, что mouseDrag () никогда не делал промежуточных ходов (т.е. что происходит во время перетаскивания в реальной жизни) для перетаскиваний, которые go справа налево или вверх.

https://codereview.qt-project.org/c/qt/qtdeclarative/+/281903

Если это не помогает, или обновление не вариант, я бы порекомендовал посмотреть на Собственные тесты Qt (хотя они написаны на C ++):

https://code.qt.io/cgit/qt/qtdeclarative.git/tree/tests/auto/quick/qquickflickable/tst_qquickflickable.cpp#n1150

0 голосов
/ 06 апреля 2020

Я думаю, MouseDrag работает только для области мыши. Вы можете обернуть каждый объект этим. Но, в конце концов, вам нужно использовать область мыши внутри вашего делегата и перетащить его.

https://doc.qt.io/qt-5/qml-qtquick-drag.html

import QtQuick 2.5

FocusScope {
    width: 1920
    height: 1080

    Flickable {
        objectName: 'flickableList'
        boundsBehavior: Flickable.StopAtBounds
        clip: true
        width: parent.width
        height: 240
        contentHeight: 500

        ListView {
            interactive: false
            height: parent.height
            width: parent.width

            model: ['example1', 'example2', 'example3', 'example4', 'example5']
            delegate: DelegateList{
                textAreaText = modelData
            }
        }
    }

    Item {
        id: footer
        height: 100
        width: parent.width
    }
}

И DelegateList.qml

Item {
    id: root

    property alias textAreaText: textArea.text

    width: 300
    height: 100
    Text {
        id: textArea
    }

    Drag.active: dragArea.drag.active
    Drag.hotSpot.x: 10
    Drag.hotSpot.y: 10

    MouseArea {
        id: dragArea
        anchors.fill: parent

        drag.target: parent
    }
}
...