对象处理触摸事件但也让它通过

2023-12-05

我想创建一个像这样工作的对象MultiPointTouchArea(因此它将具有 touchUpdated 信号),但它也不会窃取触摸,因此放置在其下方的对象也将接收触摸事件。

该解决方案可能需要创建 C++ 对象。

有没有一种简单的方法来创建这样的对象?是否可以在不“窃取”事件的情况下处理(触摸)事件?任何提示将不胜感激。


这是我正在尝试做的一个例子。我想触摸顶部Rectangle但同时我想要两者MultiPointTouchAreas 流程涉及:

import QtQuick 2.3
import QtQuick.Window 2.2

Window {
    visible: true
    width: 300
    height: 300

    Rectangle {
        id: rectangle1
        anchors.centerIn: parent
        width: 150
        height: width
        color: "red"
        MultiPointTouchArea {
            anchors.fill: parent
            mouseEnabled: false
            onTouchUpdated: {
                console.log("Bottom touch area contains:",
                            touchPoints.length,
                            "touches.")
            }
        }
    }
    Rectangle {
        id: rectangle2
        anchors.centerIn: parent
        width: 100
        height: width
        color: "blue"
        MultiPointTouchArea {
            anchors.fill: parent
            mouseEnabled: false
            onTouchUpdated: {
                console.log("Top touch area contains:",
                            touchPoints.length,
                            "touches.")
            }
        }
    }
}

如果我能找到有效的解决方案,我会将其发布在这里。我现在将尝试实施Mitch's solution.


你可以子类化QQuickItem并覆盖touchEvent()功能:

可以在子类中重新实现此事件处理程序以接收项目的触摸事件。事件信息由事件参数提供。

您可能需要显式设置accepted to false确保该项目不会窃取事件:

设置accept参数表明事件接收者想要该事件。不需要的事件可能会传播到父窗口小部件。默认情况下,isAccepted() 设置为 true,但不要依赖于此,因为子类可能会选择在其构造函数中清除它。


我可以验证上述内容将导致下部触摸区域在按下后接收所有事件(在 Android 手机上测试)。在这种情况下,您需要以某种方式过滤事件。一种方法是在 QQuickItem 子类中声明一个属性,该属性将用于指向下部触摸区域。当该属性更改时,在触摸区域安装事件过滤器:

主要.cpp:

#include <QGuiApplication>
#include <QtQuick>

class CustomTouchArea : public QQuickItem
{
    Q_OBJECT
    Q_PROPERTY(QQuickItem *targetTouchArea READ targetTouchArea WRITE setTargetTouchArea NOTIFY targetTouchAreaChanged)

public:
    CustomTouchArea() :
        mTargetTouchArea(0) {
    }

    bool eventFilter(QObject *, QEvent *event) {
        if (event->type() == QEvent::TouchUpdate) {
            qDebug() << "processing TouchUpdate...";
        }
        // other Touch events here...

        return false;
    }

    QQuickItem *targetTouchArea() const {
        return mTargetTouchArea;
    }

    void setTargetTouchArea(QQuickItem *targetTouchArea) {
        if (targetTouchArea == mTargetTouchArea)
            return;

        if (mTargetTouchArea)
            mTargetTouchArea->removeEventFilter(this);

        mTargetTouchArea = targetTouchArea;

        if (mTargetTouchArea)
            mTargetTouchArea->installEventFilter(this);

        emit targetTouchAreaChanged();
    }

signals:
    void targetTouchAreaChanged();

private:
    QQuickItem *mTargetTouchArea;
};

int main(int argc, char *argv[])
{
    QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QGuiApplication app(argc, argv);

    qmlRegisterType<CustomTouchArea>("App", 1, 0, "CustomTouchArea");

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    return app.exec();
}

#include "main.moc"

主要.qml:

import QtQuick 2.3
import QtQuick.Window 2.2

import App 1.0

Window {
    visible: true
    width: 300
    height: 300

    Rectangle {
        id: rectangle1
        anchors.centerIn: parent
        width: 150
        height: width
        color: "red"
        MultiPointTouchArea {
            id: touchArea
            anchors.fill: parent
            mouseEnabled: false
            onTouchUpdated: {
                console.log("Bottom touch area contains:",
                            touchPoints.length,
                            "touches.")
            }
        }
    }
    Rectangle {
        id: rectangle2
        anchors.centerIn: parent
        width: 100
        height: width
        color: "blue"
        CustomTouchArea {
            targetTouchArea: touchArea
            anchors.fill: parent
        }
    }
}

您可以阅读有关事件过滤器的更多信息here.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对象处理触摸事件但也让它通过 的相关文章

随机推荐

  • Java中捕获异常的顺序

    如果我没记错的话 应该首先捕获异常的子类 但是必须捕获任何 RuntimeException 和一个具体的检查异常 这应该首先捕获 try catch RuntimeException e catch IOException e 这个顺序正
  • Java 8 混乱 -> String::compareToIgnoreCase

    有人可以帮助我理解以下内容吗 This works fine List list Arrays asList a b A B str sort String compareToIgnoreCase 我可以将上述方法引用分配给任何变量吗 ho
  • 如何从存根函数参数获取属性?

    我有一项服务 它应该创建一个电子邮件类对象并将其传递给第三类 电子邮件发送者 我想检查由该函数生成的电子邮件正文 服务 php class Service var EmailService protected emailService pu
  • 用于对象导出和类型的 def 文件

    好的 我们有了一个 Node 模块string similaritywho 导出两个这样的函数 参见 https github com aceakash string similarity blob master compare strin
  • 如何在 VS Code linter 中更改 pylint 消息模板?

    我的目标是更改 VS Code 中 linter 消息的 pylint 消息模板 我使用的是 Don Jayamanne 提供的 VS Code 标准 Python 扩展 该扩展现在由 Microsoft 直接维护 默认情况下 消息格式如下
  • 根据布尔掩码将值从一个 numpy 矩阵复制到另一个

    作为一个简单的例子 我有以下内容 import numpy as np a np matrix 0 34 0 44 0 21 0 51 a max np matrix 0 35 0 40 0 20 0 50 我想应用一个转换 其中 a 中大
  • CSS中有什么尖锐的样式吗?

    我想使用 Photoshop 中的 style sharp 在我的 css 中设置一些字体的样式 有谁知道路吗 Photoshop 使用自定义字体渲染引擎 您无法使用 CSS 来模拟该引擎 此外 每个平台都有自己的渲染引擎 CSS无法控制
  • 使用来自 C# 的参数运行控制台应用程序 - GUI 连接建议

    警告 这是一个 C n00b 问题 尝试学习一些 C 同时让我经常运行的控制台应用程序变得更容易 我正在尝试运行控制台应用程序 consoleapp exe 而无需每次手动输入参数 命令通常采用以下形式 C consoleapp exe u
  • 字符串操作 - 还有其他有效的方法吗?

    我有一个要求 我需要在给定的字符串变量中插入转义序列 无论是在哪里单引号出现 我尝试使用split方法以及字符串分词器 没有一个适合我 所以我开发了下面提到的逻辑 在某些情况下它也会失败 谁能给我提供一种最简单的方法来实现这样的要求 pub
  • 查找缺少任意字段的 CouchDB 文档

    我需要一个 CouchDB 视图 可以在其中获取所有没有任意字段的文档 如果您事先知道文档的哪些字段 这很容易做到might没有 例如 这可以让你发送view my view key foo 轻松检索没有 foo 字段的文档 functio
  • 在后台发送 WhatsApp 消息或在 Android 中发送消息并关闭应用程序

    是否可以在不打开应用程序的情况下发送whatsApp消息 在后台发送 就像使用发送短信一样 smsManager sendTextMessage 12546304580 null Test Message null null 如果是这样怎么
  • 删除每个组的第一行

    假设我有一个这样的数据集 df lt data frame group c rep 1 3 rep 2 2 rep 3 2 rep 4 3 rep 5 2 score c 30 10 22 44 6 5 20 35 2 60 14 5 gr
  • OleDB 和混合 Excel 数据类型:丢失数据

    我有一个 Excel 工作表 我想读入数据表 除了 Excel 工作表中的一个特定列之外 一切都很好 ProductID 列是值的组合 例如 and n 我尝试过了让 OleDB 自动处理一切通过将其读入数据集 数据表 但 ProductI
  • 一次仅允许有一个 UITableViewCell 附件复选标记

    我有一个表格视图 其中一个部分包含用户可以 选择 的声音列表 只有当前选择的声音应该显示UITableViewCellAccessoryCheckmark 基本上我已经成功了 然而 当例如底部单元格被选中 我向上滚动表格视图 使选中的单元格
  • 如何在 python 2.6 中使用日志记录 NullHandler

    目前我的大部分代码都设计为在 python 2 76 上运行 因此 我编写的库使用以下代码 以便我的库的任何使用者都可以拥有来自该库的调试日志记录 所以在每个库文件中我都有这个 log logging getLogger name log
  • 这个插值搜索实现有什么问题?

    这是在 Internet 上找到的插值搜索算法的常见 C C 实现 然而 当与大约 100000 个整数的排序数组一起使用时 中间变量开始生成负数组索引 从而导致分段错误 问题可能是什么 include
  • 使用 boost 迭代 xml 文件

    我是 boost 和 xml 的新手 我正在尝试扫描 xml 文件并保存一些特定值 I read this文章和我的问题是 如果 xml 包含几个
  • 预测时间序列数据

    我做了一些研究 但我一直在寻找解决方案 我有一个时间序列数据 非常基本的数据框架 我们称之为x Date Used 11 1 2011 587 11 2 2011 578 11 3 2011 600 11 4 2011 599 11 5 2
  • 更改编辑控件中文本的背景

    您可以更改编辑控件区域中保持静态的文本背景吗 在编辑控件的父级中 处理WM CTLC彩色静态消息 该消息的wParam是Edit控件将要绘制的HDC 对于大多数 CTLCOLOR 消息 如果您在此 DC 中设置文本和背景颜色 则控件将使用您
  • 对象处理触摸事件但也让它通过

    我想创建一个像这样工作的对象MultiPointTouchArea 因此它将具有 touchUpdated 信号 但它也不会窃取触摸 因此放置在其下方的对象也将接收触摸事件 该解决方案可能需要创建 C 对象 有没有一种简单的方法来创建这样的