QT在触摸屏上如何实现按键长按功能?

文章讲述了在Windows10Surface上使用Qt开发时,遇到长按时按钮不响应pressed/released信号的问题。作者发现TouchEvent和MouseEvent触发机制不同,于是创建自定义MyButton类,通过event函数处理touchBegin和touchEnd信号,成功实现了长按效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

要使用按钮的长按功能,想当然的会想到使用pressed和released信号,在按钮按下和释放的时候发出一个信号。但是我在surface的win10上使用时,长按时按钮似乎不能被按下,只有在点按时可以按下,但是这样pressed和released信号都会马上被触发,起不到长按的效果。

思考

在查询资料的过程中,我发现QT中的触摸事件TouchEvent 和 鼠标事件MouseEvent的触发事件不同,当触摸结束后,pressed和released才会触发,因此用这两个信号无法实现长按的操作

解决

我放弃使用pressed和released信号,并创建了一个继承了QPushButton的新类,然后自定义两个信号并重写了event函数,问题解决。具体实现方法如下:

头文件:

#ifndef MYBUTTON_H
#define MYBUTTON_H

#include <QObject>
#include <QEvent>
#include <QPushButton>

class MyButton : public QPushButton
{
    Q_OBJECT
public:
    explicit MyButton(QWidget *parent = nullptr);
protected:
    bool event(QEvent *e)override;
signals:
    void touchBegin();
    void touchEnd();
};

#endif // MYBUTTON_H

源文件:

#include "mybutton.h"

MyButton::MyButton(QWidget *parent)
    : QPushButton(parent)
{
    setAttribute(Qt::WA_AcceptTouchEvents);
}

bool MyButton::event(QEvent *e)
{
    switch (e->type()) {
    case QEvent::KeyPress:
        emit touchBegin();
        return true;
        break;
    case QEvent::TouchEnd:
        emit touchEnd();
        return true;
    default:
        break;
    }
    return QPushButton::event(e);
}

然后把使用的按钮提升为这个类,就完成了

参考文章

https://blog.csdn.net/cuidx123/article/details/121507651

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值