前言
要使用按钮的长按功能,想当然的会想到使用pressed和released信号,在按钮按下和释放的时候发出一个信号。但是我在surface的win10上使用时,长按时按钮似乎不能被按下,只有在点按时可以按下,但是这样pressed和released信号都会马上被触发,起不到长按的效果。
思考
在查询资料的过程中,我发现QT中的触摸事件TouchEvent 和 鼠标事件MouseEvent的触发事件不同,当触摸结束后,pressed和released才会触发,因此用这两个信号无法实现长按的操作
解决
我放弃使用pressed和released信号,并创建了一个继承了QPushButton的新类,然后自定义两个信号并重写了event函数,问题解决。具体实现方法如下:
头文件:
#ifndef MYBUTTON_H
#define MYBUTTON_H
#include <QObject>
#include <QEvent>
#include <QPushButton>
class MyButton : public QPushButton
{
Q_OBJECT
public:
explicit MyButton(QWidget *parent = nullptr);
protected:
bool event(QEvent *e)override;
signals:
void touchBegin();
void touchEnd();
};
#endif // MYBUTTON_H
源文件:
#include "mybutton.h"
MyButton::MyButton(QWidget *parent)
: QPushButton(parent)
{
setAttribute(Qt::WA_AcceptTouchEvents);
}
bool MyButton::event(QEvent *e)
{
switch (e->type()) {
case QEvent::KeyPress:
emit touchBegin();
return true;
break;
case QEvent::TouchEnd:
emit touchEnd();
return true;
default:
break;
}
return QPushButton::event(e);
}
然后把使用的按钮提升为这个类,就完成了