lesson9-QT事件-阿里云开发者社区

开发者社区> 开发与运维> 正文

lesson9-QT事件

简介: 一、事件 Qt除了通过信号和槽的机制来实现一些动作,还可以通过事件来实现一些动作。当鼠标点击时会有事件产生,当键盘按下时会有事件产生,画图的时候也会有事件产生。 当编写Qt程序时,很少要考虑事件,因为当重要的事情发生时,Qt会发出信号。
一、事件
Qt除了通过信号和槽的机制来实现一些动作,还可以通过事件来实现一些动作。当鼠标点击时会有事件产生,当键盘按下时会有事件产生,画图的时候也会有事件产生。


当编写Qt程序时,很少要考虑事件,因为当重要的事情发生时,Qt会发出信号。当我们需要实现一个自己的控件或者修改先有的Qt行为时,事件才会产生作用。

如何区分事件和信号呢?当我们使用窗口部件的时候,信号起作用;当我们需要实现一个窗口部件时,事件起作用。也就是是事件是更接近底层的,而信号则是上层的

处理事件的是QObject,任何一个想要接受并处理事件的对象均需要继承自QObject。可以选择重载QObject::event(),或者将处理权交给父类。

二、常见的事件
1、QMouseEvent
QMouseEvent是鼠标事件,当有鼠标按下、松开、移动的时候就会产生鼠标事件

QMouseEvent有三个事件处理函数:
mouseMoveEvent(QMouseEvent *e),鼠标移动事件
mousePressEvent(QMouseEvent *e),鼠标点击事件
mouseReleaseEvent(QMouseEvent *e),松开鼠标事件
当产生了事件之后,对应的事件处理函数会自动被调用

事件的使用方法:
1、首先要在类中注册事件处理函数
2、然后要实现事件处理函数
3、在事件处理函数中可以实现自己的代码

e->button() 返回按下的按钮,可以是:
Qt::LeftButton、Qt::RightButton、Qt::MidButton
e->x()  e->y()可以返回鼠标的坐标

2、QKeyEvent
QKeyEvent是描述键盘事件的,当有键盘按下或者释放就会产生键盘事件
QKeyEvent有两个事件处理函数
keyPressEvent(QKeyEvent *e)
keyReleaseEvent(QKeyEvent *e)


e->modifiers()返回按钮修饰符(alt ctrl之类的按钮)

e->key()返回按下的按钮 

3、QTimerEvent
QTimerEvent是定时器事件,事件处理函数:
timerEvent(QTimerEvent *e)
e->timerId()//得到定时器Id


Qt可以启动多个定时器,定时器的ID>0
启动定时器
startTimer(30); //单位是毫秒,返回定时器id
关闭定时器
killTimer(id);

三、案列
头文件

点击(此处)折叠或打开

  1. #ifndef MYEVENT_H
  2. #define MYEVENT_H

  3. #include QtGui>

  4. class MyEvent : public QDialog
  5. {
  6. Q_OBJECT
  7. public:
  8.     MyEvent();
  9. private:
  10.     QLabel *posLabel;
  11.     int time;
  12.     void mousePressEvent(QMouseEvent *e);
  13.     void mouseMoveEvent(QMouseEvent *e);
  14.     void mouseReleaseEvent(QMouseEvent *e);
  15.     void keyPressEvent(QKeyEvent *e);
  16.     void timerEvent(QTimerEvent *e);
  17. };

  18. #endif
cpp

点击(此处)折叠或打开

  1. #include "MyEvent.h"

  2. MyEvent::MyEvent()
  3. {
  4.     time = 0;
  5.     startTimer(1000);
  6.     posLabel = new QLabel("position");
  7.     QHBoxLayout *lay = new QHBoxLayout();
  8.     lay->addWidget(posLabel);
  9.     setLayout(lay);
  10.     setWindowTitle("Event");
  11.     resize(500, 500);
  12. }
  13. #if 1
  14. void MyEvent::mousePressEvent(QMouseEvent *e)
  15. {
  16.     switch(e->button())
  17.     {
  18.         case Qt::LeftButton:
  19.             posLabel->setText("Left press");
  20.             break;
  21.         case Qt::RightButton:
  22.             posLabel->setText("right press");
  23.             break;
  24.         case Qt::MidButton:
  25.             posLabel->setText("Middle press");
  26.             break;
  27.     }
  28. }
  29. void MyEvent::mouseMoveEvent(QMouseEvent *e)
  30. {
  31.     posLabel->setText(QString::number(e->x())+ "," +QString::number(e->y()));
  32. }
  33. void MyEvent::mouseReleaseEvent(QMouseEvent *e)
  34. {

  35. }
  36. void MyEvent::keyPressEvent(QKeyEvent *e)
  37. {
  38.     switch(e->key())
  39.     {
  40.         case Qt::Key_A:
  41.             posLabel->setText(QString::number(Qt::Key_A));
  42.             break;
  43.         case Qt::Key_S:
  44.             posLabel->setText(QString::number(Qt::Key_S));
  45.             break;
  46.         default:
  47.             break;
  48.     }
  49. }
  50. #endif
  51. #if 1
  52. void MyEvent::timerEvent(QTimerEvent *e)
  53. {
  54.     time++;
  55.     posLabel->setText(QString::number(time));
  56. }
  57. #endif



 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章