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();
}
相关推荐
WL学习笔记3 小时前
模板初阶(C++)
开发语言·c++·后端·模板初阶
埃伊蟹黄面3 小时前
面试常问题目 —— STL
c++·面试·职场和发展·stl
CHANG_THE_WORLD3 小时前
ida-multi-mcp-跨版本逆向实战博客
c++
青瓦梦滋3 小时前
【在线五子棋对战】游戏匹配模块
网络·c++·网络协议·http·https
David猪大卫4 小时前
【C++修炼】STL容器—模板进阶:非类型模板参数、模板特化、模板分离编译
c语言·开发语言·c++·经验分享·笔记·学习·面试
纪念 2294 小时前
C++ vector(一)
开发语言·c++
垆边人似月.4 小时前
最少的元素个数使和为 target
数据结构·c++·算法
Zip-List4 小时前
工作小记-pytorch的算子优化: 转gpu核函数 python调c
c语言·c++·pytorch·python·cuda
暖焰核心5 小时前
多态全解——虚函数、重写、虚表与多态原理
c++
zhanghaha13145 小时前
Qt 工程实例:逐词逐句保姆级讲解
qt