Qt 自定义按钮 区分点按与长按信号,适配触摸事件

Qt 自定义按钮 区分点按与长按信号 适配触摸事件

效果

使用示例

cpp 复制代码
	// 点按
	connect(ui.btnLeft, &JogButton::stepclicked, this, &MainWindow::btnLeft_clicked);
	// 长按开始
	connect(ui.btnLeft, &JogButton::continueOn, this, &MainWindow::slotJogLeftOn);
	// 长按结束
	connect(ui.btnLeft, &JogButton::continueOff, this, &MainWindow::slotJogLeftOff);

源码

JogButton.h

cpp 复制代码
#pragma once


#include <QToolButton>

class JogButton : public QToolButton
{
	Q_OBJECT

public:
	JogButton(QWidget *parent = nullptr);
	JogButton(const QString& title, QWidget *parent = nullptr);
	~JogButton();

protected:
	virtual bool event(QEvent *e) override;

signals:
	void stepclicked();		// 点动
	void continueOn();		// 持续驱动开启
	void continueOff();		// 持续驱动关闭

private:
	void pressfunc();
	void releasefunc();

private:
	bool iscontinue = false;
	bool ispress = false;
};

JogButton.cpp

cpp 复制代码
#include "JogButton.h"

#include <QTimer>
#include <QTouchEvent>
#include <QDebug>

#define PRESS_TIME 200	// 触发长按时间

JogButton::JogButton(QWidget *parent)
	: QToolButton(parent)
{
	setAttribute(Qt::WA_AcceptTouchEvents);//支持多点触控
}

JogButton::JogButton(const QString& title, QWidget *parent)
	: QToolButton(parent)
{
	setAttribute(Qt::WA_AcceptTouchEvents);//支持多点触控
	setText(title);
}

JogButton::~JogButton()
{
}


bool JogButton::event(QEvent * e)
{
	if (this->isEnabled()) {
		switch (e->type()) {
		case QEvent::TouchBegin:
		case QEvent::MouseButtonPress:
			pressfunc();
			break;
		case QEvent::TouchEnd:
		case QEvent::MouseButtonRelease:
			releasefunc();
			break;
		}
	}
	return QToolButton::event(e);
}

void JogButton::pressfunc()
{
	if (ispress) return;
	ispress = true;
	iscontinue = false;
	QTimer::singleShot(PRESS_TIME, [=] {
		iscontinue = true;
		if (ispress) emit continueOn();
	});
}

void JogButton::releasefunc()
{
	if (!ispress) return;
	ispress = false;
	if (iscontinue) emit continueOff();
	else emit stepclicked();
}
相关推荐
旧时光林29 分钟前
P10905 [蓝桥杯 2024 省 C] 回文字符串
c语言·c++·蓝桥杯·模拟·枚举
天天进步20151 小时前
C++使用WebView2控件,通过IPC通信与Javascript交互
javascript·c++·交互
秀木易风1 小时前
VTK随笔十四:QT与VTK的交互示例(平移)
c++·qt·vtk·交互
一只鱼^_1 小时前
第十五届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组
c++·蓝桥杯·深度优先·迭代加深·图搜索算法
嗨信奥2 小时前
2025年3月GESP C++四级等级考试真题——二阶矩阵
c++·青少年编程
努力学习的小廉3 小时前
【C++】 —— 笔试刷题day_13
开发语言·c++·哈希算法
阿巴~阿巴~3 小时前
蓝桥杯速成刷题清单(上)
c语言·c++·算法·蓝桥杯
ChoSeitaku4 小时前
NO.84十六届蓝桥杯备战|动态规划-路径类DP|矩阵的最小路径和|迷雾森林|过河卒|方格取数(C++)
c++·矩阵·蓝桥杯
rqtz4 小时前
【C++面向对象】封装(上):探寻构造函数的幽微之境
c++·深拷贝浅拷贝
李匠20244 小时前
C++学习之服务器EPOLL模型、处理客户端请求、向客户端回复数、向客户端发送文件
运维·服务器·c++·学习