QT 按钮 长按 clicked事件 判断是autoRepeat触发还是松手触发的

mialo163 2020-01-15 02:08:01
设置:
ui->pushButton->setAutoRepeat(true);
ui->pushButton->setAutoRepeatDelay(2000);//初始长按时间
ui->pushButton->setAutoRepeatInterval(200);//长按后重复间隔
如上设置会出现两种情况
1.按下1990ms时松手 一次clicked()
2.2010ms两次却两次clicked() (一次autoRepeat的delay,另一次为松手后的clicked )
如用AutoRepeat ()怎样来区分这两种情况
想在on_pushButton_clicked()槽函数里面准确判断 是autoRepeat还是松手产生的clicked来判断长按

需求:捕捉用户长按
现在的做法是设置setAutoRepeatDelay(2000);
长按2秒后在Repeat产生 clicked()里面setAutoRepeat(false) 屏蔽 后面的Repeat 和 松手后的clicked;
released() 里面再setAutoRepeat(true);


qt事件有QKeyEvent::isAutoRepeat () 却不知怎么使用

或者考虑用定时器来触发click 而不使用AutoRepeat ()触发,对于长按事件有什么经验的做法没

...全文
2103 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
mialo163 2020-01-16
  • 打赏
  • 举报
回复
更正一下
/*未到达repeat时间 released()时 触发一次click 按键不为按下状态 */
mialo163 2020-01-16
  • 打赏
  • 举报
回复
总结一下
/*autoRepeat() 触发两次click 定时器触发时 按键为按下状态 */

press >TimerEvent >release>clicked()(这个时候按键为按下状态)>press>release>clicked()

tab press
event QMouseEvent(MouseMove, buttons=LeftButton, localPos=42,8, screenPos=2489,347)
event QHoverEvent(HoverMove, 0x7ffd8266b280)
event QTimerEvent(id=6)
QTimerEvent 6
tab release
on_pushButton_clicked()
long press ui->pushButton->isDown() ? true
event QInputMethodQueryEvent(queries=0x1, {})
usertimezone 8 28800
long press into timeset
tab press
event QMouseEvent(MouseButtonRelease, LeftButton, localPos=42,8, screenPos=2489,347)
event QPaintEvent(QRegion(0,0 80x25))
tab release
on_pushButton_clicked()


/*released() 触发两次click 定时器触发时 按键不为按下状态 */
press >release>clicked()(这个时候按键为抬起状态)


tab press
event QMouseEvent(MouseButtonRelease, LeftButton, localPos=48,13, screenPos=2495,352)
event QPaintEvent(QRegion(0,0 80x25))
tab release
on_pushButton_clicked()
long press ui->pushButton->isDown() ? false

  • 打赏
  • 举报
回复
引用 2 楼 mialo163 的回复:
[quote=引用 1 楼 这是一个正经昵称 的回复:] 我也没用过,固分析了一下。 第一步:创建一个PushButton,注册事件过滤器,打印事件类型。

Test4::Test4(QWidget *parent) : QWidget(parent)
{
    pb = new QPushButton(this);
    pb->setGeometry(0,0, 60,30);
    pb->setObjectName("TestButon");
    pb->setText("Test");
    pb->setAutoRepeat(true);
    pb->setAutoRepeatDelay(1000);
    pb->setAutoRepeatInterval(100);
    pb->installEventFilter(this);

    connect(pb, SIGNAL(clicked(bool)), this, SLOT(pbSlot()));
}

void Test4::pbSlot()
{
    qDebug()<<"click";
}

bool Test4::eventFilter(QObject *watched, QEvent *event)
{
    qDebug()<<event;

    return QWidget::eventFilter(watched, event);
}
第一步结果: 第二步:官网找类 并没有什么复杂用法。 第三步:过滤相关事件和对象

bool Test4::eventFilter(QObject *watched, QEvent *event)
{
    //qDebug()<<event;
    if(event->type() == QEvent::Timer)
    {
        if(watched == pb)
        {
            QTimerEvent *te = (QTimerEvent *)event;
            qDebug()<<te->timerId();
        }
    }

    return QWidget::eventFilter(watched, event);
}
由此可见,还是可以判断的出Button是不是由repeat触发的。 先说明一下,我这里按下按钮后并没有立即触发一次click事件,而是delay 1000ms之后才开始有事件。
十分感谢你的回复 我刚接触QT不久 对QT Event没有涉及(pb->installEventFilter(this); 这个我还没接触过 太菜了) 看了你的回答的我的理解是 Repeat触发的click事件会伴随着一个QTimerEvent[/quote] 其实在这之前我瞄了眼MouseEvent,它是没有repeat这个东西的,所以一个按钮被鼠标点击还能连续触发,那基本就是一个定时器做出来的。 所以应该说是鼠标按下Delay时间后会启动一个多次触发的TimerEvent,由timeOut再次触发click槽
mialo163 2020-01-15
  • 打赏
  • 举报
回复
引用 1 楼 这是一个正经昵称 的回复:
我也没用过,固分析了一下。
第一步:创建一个PushButton,注册事件过滤器,打印事件类型。

Test4::Test4(QWidget *parent) : QWidget(parent)
{
pb = new QPushButton(this);
pb->setGeometry(0,0, 60,30);
pb->setObjectName("TestButon");
pb->setText("Test");
pb->setAutoRepeat(true);
pb->setAutoRepeatDelay(1000);
pb->setAutoRepeatInterval(100);
pb->installEventFilter(this);

connect(pb, SIGNAL(clicked(bool)), this, SLOT(pbSlot()));
}

void Test4::pbSlot()
{
qDebug()<<"click";
}

bool Test4::eventFilter(QObject *watched, QEvent *event)
{
qDebug()<<event;

return QWidget::eventFilter(watched, event);
}


第一步结果:


第二步:官网找类

并没有什么复杂用法。

第三步:过滤相关事件和对象

bool Test4::eventFilter(QObject *watched, QEvent *event)
{
//qDebug()<<event;
if(event->type() == QEvent::Timer)
{
if(watched == pb)
{
QTimerEvent *te = (QTimerEvent *)event;
qDebug()<<te->timerId();
}
}

return QWidget::eventFilter(watched, event);
}




由此可见,还是可以判断的出Button是不是由repeat触发的。
先说明一下,我这里按下按钮后并没有立即触发一次click事件,而是delay 1000ms之后才开始有事件。
十分感谢你的回复 我刚接触QT不久
对QT Event没有涉及(pb->installEventFilter(this); 这个我还没接触过 太菜了)
看了你的回答的我的理解是 Repeat触发的click事件会伴随着一个QTimerEvent
  • 打赏
  • 举报
回复
我也没用过,固分析了一下。 第一步:创建一个PushButton,注册事件过滤器,打印事件类型。

Test4::Test4(QWidget *parent) : QWidget(parent)
{
    pb = new QPushButton(this);
    pb->setGeometry(0,0, 60,30);
    pb->setObjectName("TestButon");
    pb->setText("Test");
    pb->setAutoRepeat(true);
    pb->setAutoRepeatDelay(1000);
    pb->setAutoRepeatInterval(100);
    pb->installEventFilter(this);

    connect(pb, SIGNAL(clicked(bool)), this, SLOT(pbSlot()));
}

void Test4::pbSlot()
{
    qDebug()<<"click";
}

bool Test4::eventFilter(QObject *watched, QEvent *event)
{
    qDebug()<<event;

    return QWidget::eventFilter(watched, event);
}
第一步结果: 第二步:官网找类 并没有什么复杂用法。 第三步:过滤相关事件和对象

bool Test4::eventFilter(QObject *watched, QEvent *event)
{
    //qDebug()<<event;
    if(event->type() == QEvent::Timer)
    {
        if(watched == pb)
        {
            QTimerEvent *te = (QTimerEvent *)event;
            qDebug()<<te->timerId();
        }
    }

    return QWidget::eventFilter(watched, event);
}
由此可见,还是可以判断的出Button是不是由repeat触发的。 先说明一下,我这里按下按钮后并没有立即触发一次click事件,而是delay 1000ms之后才开始有事件。

16,817

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧