一、事件
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);
三、案列
头文件
-
#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
cpp
-
#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
阅读(1385) | 评论(0) | 转发(0) |