事故【Qt】

[复制链接]
发表于 昨天 17:53 | 显示全部楼层 |阅读模式
事故

event
label.cpp
  1. #include "label.h"
  2. #include<QDebug>
  3. Label::Label( QWidget * parent)
  4.     :QLabel(parent)
  5. {
  6. }
  7. void Label::enterEvent(QEvent *event)
  8. {
  9.     //显式地忽略 event 参数,表示函数内部不会使用 event 参数,也不会对其进行任何操作
  10.     (void  )event ;
  11.     qDebug( ) << "enterEvent";
  12. }
  13. void Label::leaveEvent(QEvent *event)
  14. {
  15.     //显式地忽略 event 参数,表示函数内部不会使用 event 参数,也不会对其进行任何操作
  16.      (void  )event ;
  17.     qDebug( ) << "leaveEvent";
  18. }
复制代码
label.h
  1. #ifndef LABEL_H
  2. #define LABEL_H
  3. #include <QWidget>
  4. #include<QLabel>
  5. class Label : public QLabel
  6. {
  7. public:
  8.     Label(QWidget * parent);
  9.     void enterEvent(QEvent* event);
  10.     void leaveEvent(QEvent* event);
  11. };
  12. #endif // LABEL_H
复制代码
必须要提升,否则不能构成多态

注意:提升的类的名称肯定写对 ,假如出现报错 ,很有大概是类的名称不正确
1、通过事故得到鼠标点击的详细位置
2、 按下鼠标左键(右键),开释鼠标左键(右键)
3、实现鼠标双击的功能
clicked如许的信号,就相当于是一次鼠标按下事故和一次鼠标开释事故
label.h
  1. #ifndef LABEL_H
  2. #define LABEL_H
  3. #include<QLabel>
  4. class Label :public QLabel
  5. {
  6. public:
  7.     Label(QWidget * parent);
  8.      void mousePressEvent(QMouseEvent *event) ;
  9.      void mouseReleaseEvent(QMouseEvent *event);
  10.        void mouseDoubleClickEvent(QMouseEvent *event);
  11. };
  12. #endif // LABEL_H
复制代码
label.cpp
  1. #include "label.h"
  2. #include<QDebug>
  3. #include<QMouseEvent >
  4. Label::Label(QWidget * parent)
  5.         :QLabel(parent)
  6. {
  7. }
  8. void Label::mousePressEvent(QMouseEvent *event) //鼠标左键和右键都可以触发
  9. {
  10.     if(event->button() == Qt::LeftButton)
  11.     {
  12.           qDebug() <<"按下左键" ;
  13.     }
  14.   else   if(event->button() == Qt::RightButton)
  15.     {
  16.           qDebug() <<"按下右键" ;
  17.     }
  18.     // 当前 event 对象就包含了鼠标点击位置的坐标.
  19.     qDebug() << event->x() << ", " << event->y();
  20.     // globalX 和 globalY 是以屏幕左上角为原点,获取的坐标.
  21.     qDebug() << event->globalX() << ", " << event->globalY();
  22. }
  23. void Label::mouseReleaseEvent(QMouseEvent *event)
  24. {
  25.     if (event->button() == Qt::LeftButton) {
  26.         qDebug() << "释放左键";
  27.     } else if (event->button() == Qt::RightButton) {
  28.         qDebug() << "释放右键";
  29.     }
  30. }
  31. void Label::mouseDoubleClickEvent(QMouseEvent *event)
  32. {
  33.     if (event->button() == Qt::LeftButton) {
  34.         qDebug() << "双击左键";
  35.     } else if (event->button() == Qt::RightButton) {
  36.         qDebug() << "双击右键";
  37.     }
  38. }
复制代码
注意:写完代码后必要提升
在 Qt 中,鼠标移动事故(mouseMoveEvent)在默认环境下不会对鼠标移动举行追踪,这意味着当鼠标在窗口中移动时,不会主动触发 mouseMoveEvent。如许做是为了克制产生大量的事故,从而影响步调的性能和流畅性,尤其是在实行复杂逻辑时大概导致步调卡顿
Qt为了包管步调的流畅性,默认环境下不会对鼠标移动举行追踪.鼠标移动的时间不会调用mouseMoveEvent.除非显式告诉Qt就要追踪鼠标位置.
怎样显式告诉Qt就要追踪鼠标位置?
  1. #include "widget.h"
  2. #include "ui_widget.h"
  3. #include<QDebug>
  4. #include<QMouseEvent>
  5. Widget::Widget(QWidget *parent)
  6.     : QWidget(parent)
  7.     , ui(new Ui::Widget)
  8. {
  9.     ui->setupUi(this);
  10.     //显示追踪鼠标的移动位置
  11.     this->setMouseTracking(true);
  12. }
  13. Widget::~Widget()
  14. {
  15.     delete ui;
  16. }
  17. void Widget::mouseMoveEvent(QMouseEvent *event)
  18. {
  19.     qDebug() << event->x() << ", " << event->y();
  20. }
复制代码
实现鼠标滚轮的滚动动作.
widget.h
  1. #ifndef WIDGET_H
  2. #define WIDGET_H
  3. #include <QWidget>
  4. QT_BEGIN_NAMESPACE
  5. namespace Ui { class Widget; }
  6. QT_END_NAMESPACE
  7. class Widget : public QWidget
  8. {
  9.     Q_OBJECT
  10. public:
  11.     Widget(QWidget *parent = nullptr);
  12.     ~Widget();
  13. void wheelEvent(QWheelEvent *event);
  14. private:
  15.     Ui::Widget *ui;
  16.     int total ;
  17. };
  18. #endif // WIDGET_H
复制代码
widget.cpp
  1. #include "widget.h"
  2. #include "ui_widget.h"
  3. #include<QWheelEvent>
  4. #include<QDebug>
  5. Widget::Widget(QWidget *parent)
  6.     : QWidget(parent)
  7.     , ui(new Ui::Widget)
  8. {
  9.     ui->setupUi(this);
  10.     total =0 ;
  11. }
  12. Widget::~Widget()
  13. {
  14.     delete ui;
  15. }
  16. void Widget::wheelEvent(QWheelEvent *event)
  17. {
  18.     total+= event->delta();
  19.     qDebug() << total;
  20. }
复制代码
怎样获取到用户的键盘按键?
QShortCut , 这是信号槽机制封装过,获取键盘按键的方式
keyPressEvent , 站在更底层的角度,也可以通过事故获取到当前用户键盘按下的环境.
1、获取单个按键
2、获取组合键
widget.h
  1. #ifndef WIDGET_H
  2. #define WIDGET_H
  3. #include <QWidget>
  4. QT_BEGIN_NAMESPACE
  5. namespace Ui { class Widget; }
  6. QT_END_NAMESPACE
  7. class Widget : public QWidget
  8. {
  9.     Q_OBJECT
  10. public:
  11.     Widget(QWidget *parent = nullptr);
  12.     ~Widget();
  13. void keyPressEvent(QKeyEvent *event);
  14. private:
  15.     Ui::Widget *ui;
  16. };
  17. #endif // WIDGET_H
复制代码
widget.cpp
  1. #include "widget.h"
  2. #include "ui_widget.h"
  3. #include<QKeyEvent>
  4. #include<QDebug>
  5. Widget::Widget(QWidget *parent)
  6.     : QWidget(parent)
  7.     , ui(new Ui::Widget)
  8. {
  9.     ui->setupUi(this);
  10. }
  11. Widget::~Widget()
  12. {
  13.     delete ui;
  14. }
  15. void Widget::keyPressEvent(QKeyEvent *event)
  16. {
  17. //    qDebug() << event->key();
  18.         //单个按键
  19.     if(event->key() == Qt::Key_A)
  20.     {
  21.          qDebug() <<"A" ;
  22.     }
  23.             //组合键
  24.             //Qt把这些用来搭配组合键的功能键,单独拎出来了
  25.             //modifiers 是修饰符
  26.     if(event->key() == Qt::Key_A && event->modifiers() == Qt::ControlModifier )
  27.     {
  28.          qDebug() <<"ctrl + A" ;
  29.     }
  30. }
复制代码
QTimer实现了定时器功能.在QTimer背后是QTimerEvent定时器事故举行支持的
widget.h
  1. #ifndef WIDGET_H
  2. #define WIDGET_H
  3. #include <QWidget>
  4. QT_BEGIN_NAMESPACE
  5. namespace Ui { class Widget; }
  6. QT_END_NAMESPACE
  7. class Widget : public QWidget
  8. {
  9.     Q_OBJECT
  10. public:
  11.     Widget(QWidget *parent = nullptr);
  12.     ~Widget();
  13. void timerEvent(QTimerEvent *event);
  14. private:
  15.     Ui::Widget *ui;
  16.     int timerId;
  17. };
  18. #endif // WIDGET_H
复制代码
widget.cpp
  1. #include "widget.h"
  2. #include "ui_widget.h"
  3. Widget::Widget(QWidget *parent)
  4.     : QWidget(parent)
  5.     , ui(new Ui::Widget)
  6. {
  7.     ui->setupUi(this);
  8.     //开启定时器
  9.     //timeId 是一个定时器的身份标识
  10.   timerId =  this->startTimer(1000) ;
  11. }
  12. Widget::~Widget()
  13. {
  14.     delete ui;
  15. }
  16. void Widget::timerEvent(QTimerEvent *event)
  17. {
  18.     //如果一个程序中存在多个定时器(startTimer创建的定时器),此时每个定时器都会触发timerEvent函数.先判定一下这次触发是否是想要的定时器触发的,
  19.     //不是我需要的定时器,直接忽略
  20.     if(event->timerId() != this->timerId)
  21.     {
  22.         return ;
  23.     }
  24.      int value =  ui->lcdNumber->intValue();
  25.      if(value  <= 0)
  26.      {
  27.          this->killTimer(this->timerId);
  28.          return ;
  29.      }
  30.      value -=1;
  31.     ui->lcdNumber->display(value) ;
  32. }
复制代码
moveEvent窗口移动时触发的事故
resizeEvent窗口巨细改变时触发的事故
widget.h
  1. #ifndef WIDGET_H
  2. #define WIDGET_H
  3. #include <QWidget>
  4. QT_BEGIN_NAMESPACE
  5. namespace Ui { class Widget; }
  6. QT_END_NAMESPACE
  7. class Widget : public QWidget
  8. {
  9.     Q_OBJECT
  10. public:
  11.     Widget(QWidget *parent = nullptr);
  12.     ~Widget();
  13. void moveEvent(QMoveEvent *event)  ;
  14. void resizeEvent(QResizeEvent *event)  ;
  15. private:
  16.     Ui::Widget *ui;
  17. };
  18. #endif // WIDGET_H
复制代码
widget.cpp
  1. #include "widget.h"
  2. #include "ui_widget.h"
  3. #include<QMoveEvent>
  4. #include<QResizeEvent>
  5. #include<QDebug>
  6. Widget::Widget(QWidget *parent)
  7.     : QWidget(parent)
  8.     , ui(new Ui::Widget)
  9. {
  10.     ui->setupUi(this);
  11. }
  12. Widget::~Widget()
  13. {
  14.     delete ui;
  15. }
  16. void Widget::moveEvent(QMoveEvent *event)
  17. {
  18.     qDebug() << event->pos();
  19. }
  20. void Widget::resizeEvent(QResizeEvent *event)
  21. {
  22.     qDebug() << event->size();
  23. }
复制代码
事故分发/事故过滤属于Qt事故机制背后的一些逻辑.
事故分发 : 重写event 函数,直接获取到全部的事故 ,不妥使用大概对现有的逻辑(现有的事故体系造成一些负面影响)
事故过滤: 有的场景中,比如要禁用用户的某种操纵,可以思量使用事故过滤机制

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

×
登录参与点评抽奖,加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表