Qt自定义按键实现长,短按

本文介绍Qt自定义按键实现长,短按。

Qt触摸屏应用有时会涉及到触摸屏按钮长,短按操作,如长按实现关机操作,本文基于普通QPushButton为基类,自定义按键实现长,短按操作。

1.定义新类

这里以QPushButton为基类,自定义一个新类“CustomButton”,参考代码如下:

1)头文件

#ifndef CUSTOMBUTTON_H
#define CUSTOMBUTTON_H

#include <QWidget>
#include <QElapsedTimer>
#include <QEvent>
#include <QPushButton>

class CustomButton : public QPushButton
{
    Q_OBJECT
public:
    explicit CustomButton(QWidget *parent = nullptr);

signals:
    void shortPressed(void);
    void longPressed(void);

public slots:

protected:
    bool event(QEvent *event) override;

private:
    QElapsedTimer pressTime;
    bool bLongPressed;
};

#endif // CUSTOMBUTTON_H

类中声明了2个信号,shortPressed()和longPressed()信号。

2)源文件

若想使能触摸事件,需要在构造函数中设置“setAttribute(Qt::WA_AcceptTouchEvents);”。

#include "custombutton.h"
#include <QMouseEvent>
#include <QDebug>

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

    bLongPressed = false;
}

bool CustomButton::event(QEvent *event)
{
    if (event->type() == QEvent::TouchBegin) {
        setPalette(QPalette(Qt::red));
        pressTime.start();
        bLongPressed = false;
        return true;
    } else if (event->type() == QEvent::TouchUpdate) {
        if (!bLongPressed && (pressTime.elapsed() >= 3000)) {
            bLongPressed = true;
            Q_EMIT longPressed();
        }
        return true;
    } else if (event->type() == QEvent::TouchEnd) {
        setPalette(QPalette(Qt::white));
        if (!bLongPressed) {
            Q_EMIT shortPressed();
        }
        return true;
    } else {

    }

    return QPushButton::event(event);
}

注意:在接收到触摸事件后,需要返回“true”,否则后续触摸事件无法接收。

2.控件提升

在界面中放置一个普通的PushButton,右键选择“Promoted Widgets”,添加刚才新建的类。

在界面函数中连接新类中的shortPressed()和longPressed()信号到相应的槽函数,即可实现相应的长,短按功能。

缺陷:长按操作时间不准,有时长按时间较短,有时较长。

总结,本文介绍了Qt自定义按键实现长,短按。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值