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