c++ - Qt 创建对触摸事件敏感的 QML slider

标签 c++ qt qml multi-touch

我正在创建一款触摸屏游戏,需要 2-4 名玩家,每个玩家都可以使用一对 slider 控件。问题在于 QML Slider 控件将触摸作为鼠标事件进行响应并夺取焦点。那么一次只有一名玩家可以访问一个控件。我需要多个 slider 来同时响应触摸事件。我的问题是如何做到这一点?

在各种堆栈溢出帖子的帮助下,我已经能够创建自己的答案,到目前为止似乎可行。我在下面的答案部分详细说明了答案,以免像我这样的其他新手遇到麻烦。

最佳答案

这个问题有一个纯qml的解决方案。我的第一个答案中的 TouchSlider C++ 对象(本线程的其他位置)是不必要的。这里我修改了 TouchSlider qml 代码,以消除对 touchslider(TouchSlider C++ 对象)的引用。

TouchPoint.qml:

import QtQuick 2.0
import QtQuick 2.5
import QtQuick.Controls 1.4
import QtQuick.Layouts 1.2

Item {
    property string sliderTitle

    property real sliderMin
    property real sliderMax
    property real sliderVal


    ColumnLayout{
        id: column1
        Label {
            text: qsTr(sliderTitle)
            font.pointSize: 10

        }
        Slider {
            id: touchSlider1

            minimumValue: sliderMin
            maximumValue: sliderMax

            orientation: Qt.Vertical
            value: sliderVal
            onValueChanged: function(){
                sliderVal = Math.round(this.value);
                labelSliderValue.text = qsTr(JSON.stringify(sliderVal));
            }
        }

        Label {
             id: labelSliderValue
             text: qsTr(JSON.stringify(sliderVal))
             font.pointSize: 10
        }
        function sliderSetValueFromTouch(position){
            // Assume qs a vertical slider
            var minvalue = touchSlider1.minimumValue;

            var maxvalue = touchSlider1.maximumValue;
            // Since this is a vertical slider, by assumption, get the height
            var height = touchSlider1.height;

            // Compute the new value based on position coordinate
            var newvalue = (height-position)/height * (maxvalue-minvalue);
            if (newvalue<minvalue) newvalue = minvalue;
            if (newvalue>maxvalue) newvalue = maxvalue;
            //qDebug() << newvalue;

            // Set the value of the slider
            touchSlider1.value = newvalue;
        }

        MultiPointTouchArea{
            anchors.fill: touchSlider1

            touchPoints: [
                TouchPoint {
                    id: point1
                    onPressedChanged: function(){
                        if(pressed){
                            //console.log("pressed");
                            //console.log(touchslider.testStringReturn());
                            //touchslider.sliderSetValueFromTouch(touchSlider1,point1.y);
                            column1.sliderSetValueFromTouch(point1.y);
                        }
                    }

                }
            ]
            onTouchUpdated: function(){
                //touchslider.sliderSetValueFromTouch(touchSlider1,point1.y);
                column1.sliderSetValueFromTouch(point1.y);
            }

        }
    }
}

touchslider.h 和 touchslider.cpp 文件没有增加任何值(value)。

关于c++ - Qt 创建对触摸事件敏感的 QML slider ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41419368/

相关文章:

c++ - 从插槽Blackberry 10中获取TextField-> text()

c++ - 静态链接 C++,找不到库

c++ - 在编译时评估成员的位置

c++ - Qt SQL - 配置数据库连接

Qt 应用程序断言在第二次启动时失败

c++ - 使用动态创建的选项卡元素在 C++ 和 QML 之间进行绑定(bind)

c++ - 宏中的双哈希 (##) 是什么意思?

c++ - Macdeployqt 找不到任何要部署的外部 Qt 框架

c++ - 在与应用程序相同的窗口中显示 Qt 虚拟键盘

c++ - QML 中的类型化数组? QByteArray 到 JS Uint8Array 来回互操作