Как отключить колесико мыши для 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: изменено на .