一、事件
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);
三、案列
头文件
cpp
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()可以返回鼠标的坐标
QKeyEvent是描述键盘事件的,当有键盘按下或者释放就会产生键盘事件
QKeyEvent有两个事件处理函数
keyPressEvent(QKeyEvent *e)
keyReleaseEvent(QKeyEvent *e)
e->modifiers()返回按钮修饰符(alt ctrl之类的按钮)
e->key()返回按下的按钮
QTimerEvent是定时器事件,事件处理函数:
timerEvent(QTimerEvent *e)
e->timerId()//得到定时器Id
Qt可以启动多个定时器,定时器的ID>0
启动定时器
startTimer(30); //单位是毫秒,返回定时器id
关闭定时器
killTimer(id);
头文件
点击(此处)折叠或打开
- #ifndef MYEVENT_H
- #define MYEVENT_H
-
- #include QtGui>
-
- class MyEvent : public QDialog
- {
- Q_OBJECT
- public:
- MyEvent();
- private:
- QLabel *posLabel;
- int time;
- void mousePressEvent(QMouseEvent *e);
- void mouseMoveEvent(QMouseEvent *e);
- void mouseReleaseEvent(QMouseEvent *e);
- void keyPressEvent(QKeyEvent *e);
- void timerEvent(QTimerEvent *e);
- };
-
- #endif
点击(此处)折叠或打开
- #include "MyEvent.h"
-
- MyEvent::MyEvent()
- {
- time = 0;
- startTimer(1000);
- posLabel = new QLabel("position");
- QHBoxLayout *lay = new QHBoxLayout();
- lay->addWidget(posLabel);
- setLayout(lay);
- setWindowTitle("Event");
- resize(500, 500);
- }
- #if 1
- void MyEvent::mousePressEvent(QMouseEvent *e)
- {
- switch(e->button())
- {
- case Qt::LeftButton:
- posLabel->setText("Left press");
- break;
- case Qt::RightButton:
- posLabel->setText("right press");
- break;
- case Qt::MidButton:
- posLabel->setText("Middle press");
- break;
- }
- }
- void MyEvent::mouseMoveEvent(QMouseEvent *e)
- {
- posLabel->setText(QString::number(e->x())+ "," +QString::number(e->y()));
- }
- void MyEvent::mouseReleaseEvent(QMouseEvent *e)
- {
-
- }
- void MyEvent::keyPressEvent(QKeyEvent *e)
- {
- switch(e->key())
- {
- case Qt::Key_A:
- posLabel->setText(QString::number(Qt::Key_A));
- break;
- case Qt::Key_S:
- posLabel->setText(QString::number(Qt::Key_S));
- break;
- default:
- break;
- }
- }
- #endif
- #if 1
- void MyEvent::timerEvent(QTimerEvent *e)
- {
- time++;
- posLabel->setText(QString::number(time));
- }
- #endif