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

я использую 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 ответов


Это на самом деле довольно легко, жаль, что я потратила на баунти. Все это требует 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 как будто текстового поля не было.


попробуйте это:

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 собственность. Раз уж ты застрял !Т 5.6 это должно работать для вас.

EDIT: изменено на .