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