QT编程之区分点击和双击事件

导读:本篇文章讲解 QT编程之区分点击和双击事件,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

QT编程中如果想要对点击、双击相应不同的事件,不作处理是无法实现的。比较好的方法就是使用Timer区分。

这里实现 点击、双击一个Label,弹出不同的提示框。

先上代码:

MYLABEL.h

#define MYLABEL_H
#include<QLabel>
#include<QTimer>
#include<QString>
#include<QWidget>
#include<QMainWindow>
#include"QMessageBox"

class Mylabel:public QLabel
{
    Q_OBJECT
public:
    Mylabel(const QString &text,QWidget *parent=0);
    ~Mylabel(){}
public:
    QTimer *timer;   //定时器
signals:
    void clicked();    
public slots:
    void slotClicked();     //槽函数
protected:
    void mousePressEvent(QMouseEvent* event);      //单击
    void mouseDoubleClickEvent(QMouseEvent * event);
     //双击
};

#endif // MYLABEL_H

Mylabel.cpp

#include<QLabel>
#include"MYLABEL.h"
#include"mainwindow.h"

Mylabel::Mylabel(const QString & text,QWidget* parent)
    :QLabel(parent)
{
     timer=new QTimer(this);
     this->setText(text);
     connect(timer, SIGNAL(timeout()), this, SLOT(slotClicked()));
}

void Mylabel::slotClicked()
{
    timer->stop();
    QMessageBox::information(NULL, QString::fromLocal8Bit("Click"),
                             QString::fromLocal8Bit("This is click."), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);

}
void Mylabel::mousePressEvent(QMouseEvent* event)
{
    timer->start(1000);
}

void Mylabel::mouseDoubleClickEvent(QMouseEvent * event)
{
    timer->stop();
    QMessageBox::information(NULL, QString::fromLocal8Bit("DoubleClick"),
                             QString::fromLocal8Bit("This is DoubleClick."), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);

}

实现思路:
单击是一次点击,双击是一次点击后极短的时间间隔内再一次点击。
明白了这个之后,我们可以使用一个Timer实现区分。
当第一次点击后启动Timer,当Timer时间未用尽,再次接受一次点击时,就代表是双击。
当Timer的时间已用尽,也没有接受到第二次点击,就认为是单击事件。
代码解析:
1、在MYLABEL.h,中定义了一个Timer,槽函数,单击函数,双击函数
2、在Mylabel.cpp中
void Mylabel::mousePressEvent(QMouseEvent* event)
{
timer->start(1000);
}
当有点击事件发生时,即第一次点击时,启动一个定时器。

3、 connect(timer, SIGNAL(timeout()), this, SLOT(slotClicked()));
使用connect,定时器时间用尽时调用槽函数,实现单击事件。

      槽函数关闭Timer,弹出单击提示框。

void Mylabel::slotClicked()
{
timer->stop();
QMessageBox::information(NULL, QString::fromLocal8Bit(“Click”),
QString::fromLocal8Bit(“This is click.”), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);

}
4、 当Timer时间未用尽,产生第二次点击事件时,认为是双击事件。
关闭Timer,弹出双击提示框。
void Mylabel::mouseDoubleClickEvent(QMouseEvent * event)
{
timer->stop();
QMessageBox::information(NULL, QString::fromLocal8Bit(“DoubleClick”),
QString::fromLocal8Bit(“This is DoubleClick.”), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);

}

实现效果:
未点击sdust(label)时
这里写图片描述
单击时:
这里写图片描述
双击时:
这里写图片描述
OK!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/10415.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!