Как отключить колесо мыши для TextArea, не отключая весь элемент управления? - PullRequest
0 голосов
/ 27 сентября 2018

Я использую TextArea для отображения многострочного текста со встроенными тегами <IMG ...> в делегате для ListView.У меня он установлен только для чтения (и не отключен), потому что мне нужно, чтобы гиперссылки в тексте были кликабельными, поэтому мне нужно использовать его обработчик событий onLinkActivated.Обычно это то, что вызывает Label (который не обрабатывает события колеса мыши), но Label неправильно отображает разрывы строк, когда текст включает в себя теги <IMG ...> в HTML.

Проблема, с которой я столкнулся, заключается в том, что TextArea обрабатывает события колеса мыши, даже когда оно доступно только для чтения, поэтому, если курсор окажется над одним из видимых элементов управления TextArea, ListView не будет отвечатьк событиям колесика мыши (и поэтому он не прокручивается).Другими словами, TextArea захватывает события колесика мыши, и я хочу, чтобы он этого не делал.

Я вижу в документах, что элементы управления имеют свойство wheelEnabled:, но TextArea не кажетсядля поддержки этого.

Обновление: Вот минимальный пример кода, который демонстрирует проблему:

import QtQuick.Controls 1.4 as Controls

Rectangle {

    id: test

    color: "white"
    width: 300
    anchors {
        left: parent.left
        top: parent.top
        bottom: parent.bottom
    }

    Controls.ScrollView {

        id: _scrollview

        anchors.fill: parent

        ListView {
            anchors.fill: parent
            model: 100

            delegate: Rectangle {
                id: tableRow
                width: test.width
                height: 50
                color: "yellow"

                TextArea {
                    width: test.width / 2
                    height: tableRow.height
                    readOnly: true
                    text: "Row # " + index
                }

            }

        }

    }

}

Если вы удерживаете курсор мыши над правой стороной этогоlistview (т.е. не над элементом управления TextArea в строке), колесо мыши работает как положено.Но если вы удерживаете курсор мыши над TextArea в любой из строк, ListView не будет прокручиваться колесом мыши (поскольку readOnly TextView захватывает события).

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Это на самом деле довольно легко, жаль, что я потратил впустую награду.Все, что для этого требуется, - это MouseArea, расположенное над TextArea следующим образом:

MouseArea {
    anchors.fill: txtTester
    onPressed: {
        mouse.accepted = false
    }
    onReleased: {
        mouse.accepted = false
    }

    property int scrollValue: 15
    onWheel: {
        if (wheel.angleDelta.y < 0) {
            //make sure not to scroll too far
            if (!_scrollview.flickableItem.atYEnd)
                _scrollview.flickableItem.contentY += scrollValue
        }
        else {
            //make sure not to scroll too far
            if (!_scrollview.flickableItem.atYBeginning)
                _scrollview.flickableItem.contentY -= scrollValue
        }
    }
}

Это игнорирует события нажатия и отпускания, поэтому нажатие на гиперссылки в TextArea все еще работает, но перехватывает события колеса мышии применяет их к перемещению ScrollView, как если бы TextArea там не было.

0 голосов
/ 28 сентября 2018

Попробуйте:

import QtQuick 2.4
import QtQuick.Window 2.2
import QtQuick.Controls 1.3

Window {
    visible: true
    width: 400
    height: 200

    TextArea {
        id: text
        anchors.fill: parent

        text: "Current\ntext\n\\to\nmove\ndown\ndown\ndown
               \ndown\ndown\ndown\ndown\ndown\ndown\ndown"

        flickableItem.interactive: false
    }
}

TextArea имеет свойство flickableItem.enabled.Так как вы застряли с! T 5.6, это должно сработать для вас.

РЕДАКТИРОВАТЬ: вместо flickableItem.interactive.

...