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();
}
相关推荐
深耕AI17 分钟前
【MFC文档与视图结构:数据“仓库”与“橱窗”的梦幻联动 + 初始化“黑箱”大揭秘!】
c++·mfc
励志不掉头发的内向程序员41 分钟前
STL库——二叉搜索树
开发语言·c++·学习
tan180°1 小时前
Boost搜索引擎 查找并去重(3)
linux·c++·后端·搜索引擎
追烽少年x2 小时前
QProxyStyle类中drawControl和drawComplexControl函数的区别是什么
qt
长沙红胖子Qt2 小时前
VTK开发笔记(五):示例Cone2,熟悉观察者模式,在Qt窗口中详解复现对应的Demo
qt·观察者模式·vtk·回调
阿昭L2 小时前
c++中获取随机数
开发语言·c++
3壹2 小时前
数据结构精讲:栈与队列实战指南
c语言·开发语言·数据结构·c++·算法
aaaweiaaaaaa2 小时前
c++基础学习(学习蓝桥杯 ros2有C基础可看)
c++·学习·蓝桥杯·lambda·ros2·智能指针·c++类
一拳一个呆瓜3 小时前
【MFC】对话框属性:字体 (Font Name) 和 大小 (Font Size)
c++·mfc
郝学胜-神的一滴3 小时前
基于OpenGL封装摄像机类:视图矩阵与透视矩阵的实现
c++·qt·线性代数·矩阵·游戏引擎·图形渲染