事件的发送:
- 手动发送
- 非堵塞发送 senfEvent()
- 堵塞发送 postEvent()
手动发送:
QEvent *event=new QEvent(QEvent::Hide);
QApplication::sendEvent(this,event);//手动发送事件
非堵塞发送:
bool QCoreApplication::sendEvent(QObject *receiver,QEvent *event)
- 在堆栈上创建
- 立刻处理给定的事件
QKeyEvent myevent(QEvent::KeyPress,Qt::Key_V,Qt::NoModifier);
qApp->sendEvent(this,&myevent);//发送到this
堵塞发送:
void QCoreAppliCation::postEvent(QObject*obj,QEvent*event,int priority)
- 会先把事件放到等待调度的队列中
- 必须分配在堆空间
QKeyEvent myevent(QEvent::KeyPress,Qt::Key_V,Qt::NoModifier);
qApp->sendEvent(this,&myevent);//发送到this
QKeyEvent *myEvent=new QKeyEvent(myevent);
qApp->postEvent(this,myEvent,Qt::NoModifier);
事件分发器:
简单的讲就是管理事件的地方,所有的事件都必须先经过这里,然后在进行转发。当bool QEvent* 为true时,就不会在向下转发,false的话还会向下分发。
事件分发器的函数为:
bool event(QEvent* event)
下面举个例子:
在widget.h文件中添加以下事件
void mousePressEvent(QMouseEvent *event);//鼠标点击事件
void mouseReleaseEvent(QMouseEvent *event);//鼠标松开事件
bool event(QEvent *event);//事件分发器
函数的实现:
void Widget::mousePressEvent(QMouseEvent *event)//鼠标点击事件
{
qDebug()<<"鼠标点击";
}
void Widget::mouseReleaseEvent(QMouseEvent *event)//鼠标松开事件
{
qDebug()<<"鼠标松开";
}
bool Widget::event(QEvent *event)//事件分发器
{
if(event->type()==QMouseEvent::MouseButtonPress)
{
qDebug()<<"被分发器拦截";
return true;
}
else
{
return QWidget::event(event);
}
}
功能展示:点击鼠标