您的位置:首页 > 编程语言 > Qt开发

Qt中的事件处理

2017-07-22 07:46 190 查看
图形界面应用程序的消息处理模型



操作系统发送的消息如何转为Qt中的信号?

Qt平台将系统产生的消息转换为Qt事件

Qt事件是一个QEvent的对象

Qt事件用于描述程序内部或者外部发生的动作

任意的QObject对象都具备事件处理能力

GUI应用程序的事件处理方式

Qt事件产生后立即被分到QWidget对象

QWidget中的event(QEvent*)进行事件处理

event()根据事件类型调用不同的事件处理函数

在事件处理函数中发送Qt中预定义的信号

调用信号相关联的槽函数

QPushButton事件处理分析

接收鼠标事件

调用event(QEvent*)成员函数

调用mouseReleaseEvent(QMouseEvent*)成员函数

调用click()成员函数

触发信号SIGNAL(clicked())

事件(QEvent)和信号(SIGNAL)不同

事件由具体对象进行处理

信号由具体对象主动产生

改写事件处理函数可能导致程序行为发生改变

信号是否存在对应的槽函数不会改变程序行为

一般而言,信号在具体的时间处理函数中产生

QEvent中的关键成员函数

void ignore()

接收者忽略当前事件,事件可能传递给父组件

void accept()

接收者期望处理当前事件

bool isAccept()

判断当前事件是否被处理

Qt中的事件过滤器

事件过滤器可以对其他组件接收到的事件进行监控

任意的QObject对象都可以作为事件过滤器使用

事件过滤器对象需要重写eventfilter()函数

组件通过installEventFilter()函数安装事件过滤器

事件过滤器在组件之前接收到事件

事件过滤器能够决定是否将事件转发到组件对象



事件过滤器的典型实现

// 返回true表示事件已经处理,无需传递给obj

// 返回false则正常传递到obj

bool Widget::eventFilter(QObject* obj,QEvent* e)
{
if(/* 根据 obj 判断对象 */)
{
if(/* 根据e->type判断事件 */)
{
/* 事件处理逻辑 */
}
}
/* 调用父类中的同名函数 */
return QWidget::eventFilter(obj,e);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: