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();
}
相关推荐
瓦特what?6 分钟前
关于C++的#include的超超超详细讲解
java·开发语言·数据结构·c++·算法·信息可视化·数据挖掘
祁同伟.39 分钟前
【C++】动态内存管理
开发语言·c++
一只鲲1 小时前
40 C++ STL模板库9-容器2-vector
开发语言·c++
励志不掉头发的内向程序员1 小时前
C++基础——内存管理
开发语言·c++
jdlxx_dongfangxing1 小时前
从希格斯玻色子到 QPU:C++ 的跨维度征服
c++·量子计算·希格斯玻色子·高难度科普文
千里镜宵烛2 小时前
深入理解 Linux 线程:从概念到虚拟地址空间的全面解析
开发语言·c++·操作系统·线程
欧哈东哥2 小时前
【C++】标准库中用于组合多个值的数据结构pair、tuple、array...
java·数据结构·c++
打不了嗝 ᥬ᭄3 小时前
Linux 信号
linux·开发语言·c++·算法
ZLRRLZ3 小时前
【C++】C++11
开发语言·c++
一匹电信狗3 小时前
【C++】异常详解(万字解读)
服务器·c++·算法·leetcode·小程序·stl·visual studio