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!