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

来源:互联网 发布:讲课视频的软件 编辑:程序博客网 时间:2024/04/30 04:29

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_OBJECTpublic:    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!