1. 事件的概念
事件是对各种应用程序需要知道的由应用程序内部或外部产生的事情或动作的统称。Qt中所有事件都有对应的类,他们继承自QEvent类。
当用户按下鼠标、敲下键盘,或者窗口需要重新绘制的时候,会发生一个重绘事件。一些事件是在用户操作时出,例如鼠标左键按下事件,另一些事件可以由系统自动发出,如定时器事件。
1. 事件与信号槽的区分
从信号和事件的产生来区分两者的不同:
事件与信号槽不相同,例如,我们使用鼠标点击界面上的按钮时,会产生鼠标事件QMouseEvent(不是按钮产生的),由于你按下了按钮,按钮会发出clicked信号(信号是按钮产生的)。
事件与信号是两个不同层面的东西,它们的发出者不同,作用也不同。事件由外部实体生成,事件更底层。
信号需要关注的是产生信号的对象,槽函数需要对信号做出相应的响应动作。
通常,使用Qt提供的控件时,我们一般关心的是信号和槽函数,如果我们自定义控件,一般关心的是事件,在事件中实现目标的需要,例如自定义MyLabel显示圆形图片。
从使用角度区分信号和事件的不同:
信号槽:signal由具体对象发出,然后交给connect关联的槽函数去处理;
事件:Qt中使用事件队列对所有发出的事件进行维护,每当有新事件产生时,会被追加到事件队列的末尾,前一个事件处理完毕后,取出后一个事件处理。
有些事件可以不进入事件队列,事件产生后直接进行处理,并且事件可以使用“事件过滤器”进行过滤。
2. 事件的处理方法
Qt中所有从QObject继承的子类都可以接收和处理时间;
-
重写控件的事件方法,例如paintEvent、mousePressEvent、mouseReleaseEvent,这是最简单处理事件的方法,但是只能处理特定的事件
-
在对象上面安装事件过滤器,使用过滤器可以在一个界面类中同时处理不同类型、不同子控件的事件
-
重新实现notify()函数,可以在事件过滤器得道事件前对事件进行处理;
-
给QApplication安装事件过滤器,同时处理一个应用程序中的不同事件;
-
重新实现event()方法
3. 鼠标和滚轴事件
1. 窗口任意位置拖动
窗口任意位置按下鼠标左键拖动窗口(不仅是在标题栏按下鼠标左键)
//鼠标坐标和窗口位置的差值 QPoint m_offset;----在.h文件中声明为全局变量
void EventSystem10::mousePressEvent(QMouseEvent *pEvent)
{
//如果是鼠标左键按下
if (pEvent->button() == Qt::LeftButton) {
//pEvent->globalPos()左键按下时鼠标的全局坐标
//鼠标左键按下时敞口左上角坐标
m_offset = pEvent->globalPos() - this->pos();
//改变鼠标光标形状
QCursor cursor;
cursor.setShape(Qt::ClosedHandCursor);
QAppl