**引言:**之前查过不少关于实现长按的博客,但是好多方法在响应长按的同时也会同时响应短按,导致我们无法区分长按和短按的区别。
首先进入ui界面,对你需要的按钮右键生成槽函数,如下图所示:
我们需要创建这两个槽函数
为了实现长按这一行为,我们需要引入头文件 QTimer
同时为了方便控制QTimer的对象,我们把它声明在头文件中。
为了计数,我们需要声明一个press_time用来计时按了几秒。
我的头文件如下:
#ifndef USER_LOG_ITEM_H
#define USER_LOG_ITEM_H
#include <QWidget>
#include <QTimer>
#include <QDebug>
namespace Ui {
class user_log_item;
}
class user_log_item : public QWidget
{
Q_OBJECT
public:
explicit user_log_item(QWidget *parent = nullptr);
~user_log_item();
private slots:
void on_pressTime_btn_pressed();
void on_pressTime_btn_released();
private:
Ui::user_log_item *ui;
int press_time=0;
QTimer *timer = new QTimer;
};
#endif // USER_LOG_ITEM_H
对两个槽函数的实现如下:
void user_log_item::on_pressTime_btn_pressed()
{
connect(timer,&QTimer::timeout,this,[=]{
press_time++;//每过1000毫秒press_time加一
disconnect(timer,0,this,0);//先断开信号并将计数归零
press_time=0;
qDebug()<<"触发了长按";//这里可以改成你需要的长按后触发的函数
});
timer->start(1000);//这里是长按的时间,当按下按钮1000毫秒后才触发timeout这个信号。
}
void user_log_item::on_pressTime_btn_released()
{
disconnect(timer,0,this,0);//这里是必须的,因为按下的时候就开始计时,所以松开时必须断开信号并将计数归零
//否则,实现的效果就是点击后,等待一秒就会输出debug信息
press_time=0;
}
创作不易,觉得有用的朋友点赞收藏支持一下,谢谢!