如何在不禁用整个控件的情况下禁用 TextArea 的鼠标滚轮?
How can I disable the mouse wheel for a TextArea without disabling the entire control?
我正在使用 TextArea
在 ListView
的委托中显示带有嵌入 <IMG ...>
标记的多行文本。我将它设置为只读(而不是禁用),因为我需要文本中的超链接可以点击,所以我需要使用它的 onLinkActivated
事件处理程序。这通常需要 Label
(它不处理鼠标滚轮事件),但是当文本在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
}
}
}
}
}
如果您将鼠标光标悬停在此列表视图的右侧(即不悬停在行中的 TextArea
控件上),鼠标滚轮将按预期工作。但是,如果您将鼠标光标悬停在任何行的 TextArea
上,ListView
将不会随鼠标滚轮滚动(因为 readOnly TextView
正在捕获事件)。
试试这个:
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
。
这其实很容易,可惜我浪费了赏金。所有这一切都需要一个 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 不存在一样。
我正在使用 TextArea
在 ListView
的委托中显示带有嵌入 <IMG ...>
标记的多行文本。我将它设置为只读(而不是禁用),因为我需要文本中的超链接可以点击,所以我需要使用它的 onLinkActivated
事件处理程序。这通常需要 Label
(它不处理鼠标滚轮事件),但是当文本在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
}
}
}
}
}
如果您将鼠标光标悬停在此列表视图的右侧(即不悬停在行中的 TextArea
控件上),鼠标滚轮将按预期工作。但是,如果您将鼠标光标悬停在任何行的 TextArea
上,ListView
将不会随鼠标滚轮滚动(因为 readOnly TextView
正在捕获事件)。
试试这个:
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
。
这其实很容易,可惜我浪费了赏金。所有这一切都需要一个 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 不存在一样。