如何在不禁用整个控件的情况下禁用TextArea的鼠标滚轮?

时间:2018-09-27 20:18:34

标签: qt qml qtquickcontrols

我正在使用TextArea<IMG ...>的委托中显示带有嵌入式ListView标签的多行文本。我将其设置为只读(但未禁用),因为我需要文本中的超链接才能单击,因此我需要使用其onLinkActivated事件处理程序。通常这需要调用Label(它不能处理鼠标滚轮事件),但是当文本中的Label标签中包含<IMG ...>标记时,TextArea不能正确呈现换行符。 HTML。

我遇到的问题是,TextArea即使是只读的也可以处理鼠标滚轮事件,因此,如果光标恰好位于可见的ListView控件之一上,则{ {1}}将不会响应鼠标滚轮事件(因此不会滚动)。换句话说,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
                }

            }

        }

    }

}

如果将鼠标光标悬停在此列表视图的右侧(即,不在行中的TextArea控件上方),则鼠标滚轮将按预期工作。但是,如果将鼠标光标悬停在任何行中的TextArea上,ListView将不会用鼠标滚轮滚动(因为readOnly TextView正在捕获事件)。

2 个答案:

答案 0 :(得分: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,就像TextArea不在那里一样。

答案 1 :(得分:0)

尝试一下:

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