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();
}
相关推荐
qq_433554547 分钟前
C++ 面向对象编程:+号运算符重载,左移运算符重载
开发语言·c++
努力学习编程的伍大侠12 分钟前
基础排序算法
数据结构·c++·算法
yuyanjingtao1 小时前
CCF-GESP 等级考试 2023年9月认证C++四级真题解析
c++·青少年编程·gesp·csp-j/s·编程等级考试
闻缺陷则喜何志丹1 小时前
【C++动态规划 图论】3243. 新增道路查询后的最短距离 I|1567
c++·算法·动态规划·力扣·图论·最短路·路径
charlie1145141911 小时前
C++ STL CookBook
开发语言·c++·stl·c++20
小林熬夜学编程2 小时前
【Linux网络编程】第十四弹---构建功能丰富的HTTP服务器:从状态码处理到服务函数扩展
linux·运维·服务器·c语言·网络·c++·http
倔强的石头1062 小时前
【C++指南】类和对象(九):内部类
开发语言·c++
A懿轩A3 小时前
C/C++ 数据结构与算法【数组】 数组详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·数组
机器视觉知识推荐、就业指导3 小时前
C++设计模式:享元模式 (附文字处理系统中的字符对象案例)
c++
半盏茶香3 小时前
在21世纪的我用C语言探寻世界本质 ——编译和链接(编译环境和运行环境)
c语言·开发语言·c++·算法