Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5787263
  • 博文数量: 409
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 8273
  • 用 户 组: 普通用户
  • 注册时间: 2013-10-23 19:15
个人简介

qq:78080458 学习交流群:150633458

文章分类

全部博文(409)

文章存档

2019年(127)

2018年(130)

2016年(20)

2015年(60)

2014年(41)

2013年(31)

分类: 嵌入式

2016-02-02 13:49:08

一、事件
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



 

阅读(1385) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~