目录1.Qt中事件的来源,谁接收处理。2.事件处理顺序3.事件过滤器4.event方法5.鼠标进入事件6.accept(),ignore()1.Qt中事件的来源,谁接收处理。 Qt中
Qt中事件的来源有两个:程序外部和内部,多数情况下来自操作系统,可以通过bool QEvent::spontaneous() const函数来获知,返回true,事件发生在应用程序之外(系统事件),否则返回false。
事件由QObject类来接收,是Qt对象模型的核心,所有需要处理的事件类都必须继承QObject。
首先QCoreApplication::exec()开启了事件循环,一直到QCoreApplication::exit()被调用才终止,所以说事件循环是伴随着Qt程序的整个运行周期,事件被分发到事件队列中,当队列中有事件时会不停的将事件发送给QObject对象,队列为空时就阻塞,以下为处理顺序。
示例:
void Widget::on_pushButton_clicked()
{
QKeyEvent eventPress(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier);
QApplication::sendEvent(ui->label, &eventPress);
}
void Widget::on_pushButton_2_clicked()
{
QKeyEvent *eventPress = new QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier);
QApplication::postEvent(ui->label, eventPress);
}
点击上图中按钮会发送QLabel标签的键盘按下tab键事件,我自定义了一个WLabel类继承自QLabel,重写了event方法。
bool WLabel::event(QEvent *e)
{
if(e->type() == QEvent::KeyPress)
{
QKeyEvent *keyEvent = (QKeyEvent*)e;
if(keyEvent->key() == Qt::Key_Tab)
{
qDebug()<<"press tab key";
return ture;
}
}
return QLabel::event(e);
}
事件会发送到WLabel类的event方法中,会打印出下面的结果。
事件的传送和处理流程的第一站是事件过滤器eventFilter(),某个对象A可以通过给另一个对象B安装事件处理器,实现对对象B事件的监听或者拦截功能。我们可以给A取名监听器,B取名接收器。一个对象可以监听多个对象,一个对象也可以被多个事件监听。事件过滤器返回true则表示事件已经处理完毕,否则传递给下一个监听器或者接收器本身。
void QObject::installEventFilter(QObject *filterObj)
bool eventFilter(QObject *obj, QEvent *event);
Qt的事件过滤由以上两个方法实现,首先安装一个事件过滤器,然后重写bool eventFilter(QObject *obj, QEvent *event)。
filterObj表示事件筛选器对象,它接收发送到此QObject对象的所有事件。筛选器可以停止事件,也可以将事件转发给此QObject对象。事件过滤器filterObj通过它的eventFilter()函数接收事件。
eventFilter()有返回值。
Qt 事件过滤器(秒懂)_Mr.codeee的博客-CSDN博客
当经过事件过滤器后,未过滤掉的事件会进入到event方法中,event()函数主要用于事件的分发。所以,如果你希望在事件分发之前做一些操作,就可以在派生类中重写这个event()函数。
例:实现一些鼠标进出的打印,键盘按键一些打印。
bool WLabel::event(QEvent *e)
{
if(e->type() == QEvent::Enter)
{
qDebug()<<"WLabel event :enter";
return true;
}
else if(e->type() == QEvent::Leave)
{
qDebug()<<"WLabel event :Leave";
return true;
}
else if(e->type() == QEvent::KeyPress)
{
QKeyEvent *keyEvent = (QKeyEvent*)e;
if(keyEvent->key() == Qt::Key_Tab)
{
qDebug()<<"press tab key";
return true;
}
}
return QLabel::event(e);
}
上述代码中event如果事件e被识别并处理,则应返回true,否则交给它的基类QLabel来处理。
bool WLabel::event(QEvent *e)
{
if(e->type() == QEvent::Enter)
{
qDebug()<<"WLabel event :enter";
}
return QLabel::event(e);
}
上述代码,
void WLabel::enterEvent(QEvent *event)
{
qDebug()<<"WLabel enterEvent";
}
在我们做UI界面时,经常会重写mousePressEvent,wheelEvent等函数,根据不同情况要对事件event进行特殊处理。
当执行event->accept()时,意味着这次的事件已经被“我”接受啦,只有我使用。
当执行event->ignore()时,意味着这次的事件“我”不要接受他,函数执行完event给我的父窗口,他会需要的。
差别也就是要不要传递给父窗口,accept不传递,ignore传递,注意是父窗口,不是基类。
到此这篇关于Qt 事件处理机制的深入理解的文章就介绍到这了,更多相关Qt 事件处理 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
--结束END--
本文标题: Qt 事件处理机制的深入理解
本文链接: https://www.lsjlt.com/news/146546.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0