QT学习(十三)——事件

事件就是处理来自鼠标键盘等的信号
----------------------------------------------------

派生标签

.h文件

#ifndef MYABEL_H
#define MYABEL_H

#include <QWidget>
#include<QLabel>

class myabel : public QLabel
{
    Q_OBJECT
public:
    explicit myabel(QWidget *parent = nullptr);
protected:
    //鼠标点击事件
    void mousePressEvent(QMouseEvent *ev)override;
    //鼠标施放事件
    void mouseReleaseEvent(QMouseEvent *ev) override;
    //鼠标移动事件
    void mouseMoveEvent(QMouseEvent *ev) override;
    //进入窗口事件
    void enterEvent(QEvent*e);
    //离开窗口事件
    void leaveEvent(QEvent*e);
signals:

};

#endif // MYABEL_H

.cpp文件

#include "myabel.h"
#include<QMouseEvent>
#include<QString>
#include<QDebug>
myabel::myabel(QWidget *parent) : QLabel(parent)
{
    this->setMouseTracking(true);//设置默认追踪鼠标,这样的话就可以不点击而获取鼠标移动的坐标
}
//处理鼠标点击的信息,获取鼠标点击的坐标,并且输出,以及判断按下的是左还是右
void myabel::mousePressEvent(QMouseEvent *ev)
{
    int i=ev->x();
    int j=ev->y();
    if(ev->button()==Qt::LeftButton)
    {
        qDebug()<<"按下了鼠标左键!";
    }
    else if(ev->button()==Qt::RightButton)
    {
        qDebug()<<"按下了鼠标右键!";
    }
    else if(ev->button()==Qt::MidButton)
    {
        qDebug()<<"按下了鼠标中间的按键!";
    }
    QString text=QString("<center><h1>Mouse Press:(%1,%2)</h1></center>")
            .arg(i).arg(j);
    this->setText(text);
}
void myabel::mouseReleaseEvent(QMouseEvent *ev)
{
    QString text=QString("<center><h1>Mouse Release:(%1,%2)</h1></center>")
            .arg(ev->x()).arg(ev->y());
    this->setText(text);
}
//注意:只有在第一次点击完毕鼠标之后才会调用这个函数
void myabel::mouseMoveEvent(QMouseEvent *ev)
{
    QString text=QString("<center><h1>Mouse Move:(%1,%2)</h1></center>")
            .arg(ev->x()).arg(ev->y());
    //this->setText(text);//如果要看鼠标移动的效果,就只能屏蔽这条语句。
}
void myabel::enterEvent(QEvent *e)
{
    QString text=QString("<center><h1>Mouse enter</h1></center>");
    this->setText(text);
}
void myabel::leaveEvent(QEvent *e)
{
    QString text=QString("<center><h1>Mouse leave</h1></center>");
    this->setText(text);
}

-------------------------------------------------------------------------------------

窗口

.h文件

#ifndef EVENT_H
#define EVENT_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class event; }
QT_END_NAMESPACE

class event : public QWidget
{
    Q_OBJECT

public:
    event(QWidget *parent = nullptr);
    ~event();
protected:
    //键盘按下事件
    void keyPressEvent(QKeyEvent *event) override;
    //计时器事件
    void timerEvent(QTimerEvent*e);
private:
    Ui::event *ui;
    int timeId;
    int other_time_id;
};
#endif // EVENT_H

.cpp文件

#include "event.h"
#include "ui_event.h"
#include<QDebug>
#include<QKeyEvent>
event::event(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::event)
{
    ui->setupUi(this);
    //使得定时器开始,timeId获取计时器的编号(个人理解)
    timeId=this->startTimer(1000);//计时器以毫秒为单位,这个函数传参是每隔多少毫秒触发一次
    other_time_id=startTimer(500);
}

event::~event()
{
    delete ui;
}
void event::keyPressEvent(QKeyEvent *event)
{
    qDebug()<<(char)event->key();
    if(event->key()==Qt::Key_A)
    {
        QString str=QString("<center><h1>一见你就笑</h1></center>");
        ui->label->setText(str);
    }
}

void event::timerEvent(QTimerEvent *e)
{
    static int sec=0;
    sec++;
    //像下面这样获取并且判断计时器的id是必要的,因为不判断获取的id的话就会导致相应的计时器操作发生BUG
    if(e->timerId()==timeId)
    {
      ui->label->setText(QString("<center><h1>timer out:%1</h1></center>").arg(sec));
      //当计时器累加到5的时候就停止计时
      if(sec==5)
      this->killTimer(timeId);
    }
    else if(e->timerId()==other_time_id)
    {
        ui->label_2->setText(QString("<center><h1>timer out:%1</h1></center>").arg(sec));
    }
}

----------------------------------------------------------------------------------------------------------

运行:

上下两个计时器事件,上面的比较慢,在计时到5的时候会停止,下面的比较快,不会停止

鼠标移动进入窗口

鼠标移动离开窗口

鼠标点击窗口(按下不放)

鼠标松开

而且本来可以打印出鼠标不点击时的在各个屏幕上的坐标,但是由于要看其他内容所以屏蔽了

如果有两个计时器,那么需要对两个计时器分开进行处理获取计时器ID,从而分开操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值