QT开发中文网

QEvent::TouchUpdate 实现长按弹出菜单

在 Qt 中,要实现长按触摸屏幕时弹出上下文菜单的功能,你可以使用 QEvent::TouchUpdate 事件来检测触摸状态,并结合定时器 (QTimer) 来处理长按事件。下面是一个示例代码,展示了如何实现这一功能:

#include <QWidget>
#include <QMenu>
#include <QTouchEvent>
#include <QTimer>
#include <QMouseEvent>

class MyWidget : public QWidget {
    Q_OBJECT

public:
    MyWidget(QWidget *parent = nullptr) : QWidget(parent) {
        setAttribute(Qt::WA_AcceptTouchEvents); // 允许接受触摸事件
        
        // 初始化定时器
        longPressTimer = new QTimer(this);
        connect(longPressTimer, &QTimer::timeout, this, &MyWidget::showContextMenu);
    }

protected:
    void touchEvent(QTouchEvent *event) override {
        foreach (const QTouchEvent::TouchPoint &point, event->touchPoints()) {
            if (point.state() == Qt::TouchPointPressed) {
                pressPosition = point.pos();
                longPressTimer->start(500); // 设置长按时间为500毫秒
            } else if (point.state() == Qt::TouchPointReleased) {
                longPressTimer->stop(); // 停止定时器,如果释放则不再弹出菜单
                
                // 如果没有达到长按条件,则可处理其他操作(如普通点击)
                if (!isLongPressTriggered) {
                    handleClick(point.pos());
                }
                
                isLongPressTriggered = false; // 重置长按标记
            } else if (point.state() == Qt::TouchPointMoved) {
                // 如果触点移动,停止计时器
                longPressTimer->stop();
            }
        }

        QWidget::touchEvent(event); // 确保调用基类实现
    }

private slots:
    void showContextMenu() {
        longPressTimer->stop(); // 停止计时器以避免多次调用
        isLongPressTriggered = true; // 设置长按标记

        QMenu contextMenu(this);
        contextMenu.addAction("Action 1", this, [](){ /* Action 1 Code */ });
        contextMenu.addAction("Action 2", this, [](){ /* Action 2 Code */ });
        
        contextMenu.exec(mapToGlobal(pressPosition.toPoint())); // 弹出菜单,位置为触控点的位置
    }

private:
    QPointF pressPosition;
    QTimer *longPressTimer;
    bool isLongPressTriggered = false;

    void handleClick(const QPointF &pos) {
        // 普通点击事件的处理逻辑,可以自定义
    }
};

工作原理:

  1. 接收触摸事件:重写 touchEvent() 方法来处理 QEvent::TouchUpdate 事件。
  2. 启动定时器:当检测到 Qt::TouchPointPressed 状态时,启动一个定时器并设定延迟(如500毫秒)。
  3. 停止计时器:如果检测到 Qt::TouchPointReleased 状态,停止定时器,并且根据是否达到了长按条件决定是显示上下文菜单还是执行点击操作。
  4. 弹出上下文菜单:在定时器超时时调用 showContextMenu() 方法,该方法创建并弹出上下文菜单。

这样,当用户在屏幕上进行长按动作(超过指定时间)后,就会看到弹出的菜单。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://qt.0voice.com/?id=12663

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?