Nano Hash - криптовалюты, майнинг, программирование

Отключить колесо мыши для QML Slider

Я хочу иметь возможность прокручивать Flickable колесиком мыши (или двумя пальцами на сенсорной панели), без изменения Sliders, которые он может содержать.

Пример кода и приложение результатов:

import QtQuick 2.7
import QtQuick.Window 2.2
import QtQuick.Controls 1.4

ApplicationWindow {
    id: rootWindow

    visible: true
    width: 400
    height: 200
    title: qsTr("Hello World")

    ScrollView {
        anchors.fill: parent
        flickableItem.flickableDirection: Flickable.VerticalFlick

        Column {
            Repeater {
                model: 40
                Slider {
                    width: rootWindow.width * 0.9
                }
            }
        }
    }
}

результат приложения

Похоже, что в прошлом была попытка исправить это, но не успешный.

РЕДАКТИРОВАТЬ: это относится только к Controls 1.x, поскольку элементы управления, похоже, не имеют этой проблемы, начиная с версии 2.0.


  • Вы пытались исправить? (Установка значения Slider.wheelarea.enabled на false.) 21.12.2016
  • @maxik wheelarea компонент Slider недоступен извне. Это должно быть возможно изменить путем редактирования исходных текстов Qt для Slider, но я боюсь, что я тоже не могу этого сделать. 21.12.2016
  • Почему вы используете устаревший QtQuick.Controls 1.4, а не QtQuick.Controls 2.0? 21.12.2016

Ответы:


1

Вы можете поместить MouseAreas на ползунки, чтобы украсть событие колеса мыши.

Что-то вроде этого:

import QtQuick 2.7
import QtQuick.Window 2.2
import QtQuick.Controls 1.4

ApplicationWindow {
    id: rootWindow

    visible: true
    width: 400
    height: 200
    title: qsTr("Hello World")

    ScrollView {
        id: _scrollview
        anchors.fill: parent
        flickableItem.flickableDirection: Flickable.VerticalFlick

        Column {
            Repeater {
                model: 40
                Slider {
                    width: rootWindow.width * 0.9
                    property int scrollValue: 10

                    MouseArea {
                            anchors.fill: parent
                            onWheel: {
                                //check if mouse is scrolling up or down
                                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
                                }
                            }
                            onPressed: {
                                // forward mouse event
                                mouse.accepted = false
                            }
                            onReleased: {
                                // forward mouse event
                                mouse.accepted = false
                            }
                    }
                }
            }
        }
    }
}

Использование события onWheel - для пересылки любой прокрутки к ScrollView. Другие события мыши, такие как щелчок, могут быть перенаправлены родителям (в данном случае ползункам), установив mouse.accepted = false; для любого события мыши, которое вы хотите переслать.

Изменить: Я только что увидел, что вам не нужно изменять содержимое ползунков. Вы также можете попробовать разместить MouseArea по всему ScrollView и проделать то же самое.

21.12.2016
  • Благодарность! Я могу разместить что-то поверх Slider, но не могу редактировать для него исходники Qt. Скоро попробую и расскажу о своих результатах. 21.12.2016
  • Добавление дополнительных объектов с довольно сложными обработчиками событий только для того, чтобы отключить функцию / ошибку в устаревшем модуле, мне не кажется решением . Это кажется довольно хакерским. Было бы, наверное, даже лучше, просто полностью переопределить Slider. Кто-то может даже сказать, что всегда было бы лучше сделать это, чем даже рассматривать использование QtQuick.Control ;-) 21.12.2016

  • 2

    Самым простым, если это возможно для вас, было бы, вероятно, изменить с QtQuick.Controls 1.4, который можно рассматривать как устарел, не поддерживается или малоэффективный для нового QtQuick.Controls 2.0

    В этой версии ваша проблема решена.
    Чтобы удовлетворить вашу потребность в QtQuick.Controls 1.4, мы импортируем QtQuick.Controls 2.0 с псевдонимом:

    import QtQuick 2.7
    import QtQuick.Controls 1.4
    import QtQuick.Controls 2.0 as NewCtrl
    
    Column {
        Slider {
            id: oldslider // old slider from QtQuick.Controls 1.4 with your issue
            width: 500
            height: 250
        }
    
        NewCtrl.Slider {
            id: newsli // new slider without your issue. Both side by side
            width: 500
            height: 30
            wheelEnabled: false // use this to enable or disable the wheel
        }
    }
    

    Конечно, вы также можете использовать псевдоним для старых элементов управления и использовать новый в качестве основного ... Или использовать псевдоним и того, и другого. Как тебе нравится

    21.12.2016
  • вы правы, но мне нужен menuBar для окна моего приложения, которое по какой-то причине было удалено в этой версии 21.12.2016
  • Это плохо. Никто не должен мешать вам использовать menuBar. К счастью, вы можете импортировать оба: import QtQuick.Controls 2.0 и import QtQuick.Controls 1.4 as OldCtrl, а затем использовать старый добрый OldCtrl.MenuBar ;-) 21.12.2016
  • Или дождитесь Qt 5.8 и надейтесь, что он там. 21.12.2016
  • немного поигравшись с Controls 2.0, я понял, что не так-то просто переключиться на него, когда у вас уже есть приложение среднего размера, основанное на Controls 1.x. В любом случае ценю ваш ответ, спасибо! 28.12.2016

  • 3

    Взлом с здесь сделал это за меня.

    Slider {
        id: slider
        Component.onCompleted: {
            for (var i = 0; i < slider.children.length; ++i) {
                if (slider.children[i].hasOwnProperty("onVerticalWheelMoved") && slider.children[i].hasOwnProperty("onHorizontalWheelMoved")) {
                    slider.children[i].destroy()
                }
            }
        }
    }
    

    Это может не работать с другими элементами управления (например, ComboBox).

    28.12.2016
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..