Qt发送事件分为两种

-阻塞型事件发送

  • 需要重写接收对象的event()事件处理函数
  • 当事件发送后,将会立即进入event()事件处理函数进行事件处理
  • 通过sendEvent()静态函数实现阻塞发送:
bool QApplication::sendEvent ( QObject * receiver, QEvent * event ) ;
// receiver:接收对象, event :要发送的event类型(比如:鼠标双击)
//当有事件发送,将会调用receiver对象里的event()成员函数进行事件处理
  • sendEvent()函数是阻塞式的,所以支持栈空间/堆空间事件对象的发送(局部对象和new分配的对象)
  • new分配的事件对象被处理后,会由Qt内部自动摧毁

-非阻塞型事件发送

  • 需要重写接收对象的event()事件处理函数
  • 当事件发送后立即返回,事件将会发送到事件队列中等待处理
  • 通过postEvent()静态函数实现非阻塞发送:
void QApplication::postEvent ( QObject * receiver, QEvent * event ); 
  • postEvent()函数是非阻塞式的,所以只能支持栈堆空间事件对象的发送(new分配的对象)
  • new分配的事件对象被处理后,会由Qt内部自动摧毁

示例-通过sendEvent()发送预定义的键盘Delete按键事件

Wiget.h

#ifndef WIDGET_H

#define WIDGET_H

#include <QWidget>

#include <QtGui>

class Widget : public QWidget

{

    Q_OBJECT

private :

    QTextEdit edit;

    QPushButton bt;

private slots:

   void  onPushButton();

public:

    explicit Widget();

};

#endif // WIDGET_H

Widget.c

#include "widget.h"

Widget::Widget() :  edit(this),bt("Delete",this)
{
edit.setGeometry(,,,);
bt.setGeometry(,,,);
connect(&bt, SIGNAL(clicked()), this, SLOT(onPushButton()));
} void Widget::onPushButton()
{
int key = Qt::Key_Delete ; QKeyEvent EventPress(QEvent::KeyPress,key,Qt::NoModifier);
QApplication::sendEvent(&edit,&EventPress); //发送键盘按下事件 QKeyEvent EventRelease(QEvent::KeyRelease,key,Qt::NoModifier);
QApplication::sendEvent(&edit,&EventRelease); //发送键盘松开事件
}

效果

 

 

自定义事件对象

  • 自定义的事件类必须继承自QEvent,并且无需指定父类
  • 自定义的事件类必须拥有全局唯一Type值,使用QEvent::User+value即可
  • 自定义事件类示例:
class StringEvent : public QEvent
{
public:
static const Type = static_cast<Type>(QEvent::User+0x10);
explicit QStringEvent();
//... ...
} QStringEvent::QStringEvent() :
QEvent(TYPE) //注册TYPE值
{
//... ...
}
  • 由于Qt不认识自定义事件,所以程序里需要提供处理自定义事件对象的方法

常用两种方法来处理

1.通过事件过滤器处理

  • 通过installEventFilter()安装到目标对象
  • eventFilter()函数里处理事件

2.重写目标对象的event()函数

  • event ()函数里处理事件

 

示例-通过单击鼠标按钮发送自定义事件QStringEvent

QStringEvent文件:

class QStringEvent : public QEvent
{
private:
QString mstr; public:
const static Type TYPE = static_cast<Type>(QEvent::User+0x10);
explicit QStringEvent(QString s);
QString str();
}; QStringEvent::QStringEvent(QString s) :
QEvent(TYPE)
{
mstr = s;
} QString QStringEvent::str()
{
return mstr;
}

widget文件:

class Widget : public QWidget
{
private :
QLabel label;
bool event( QEvent * e);
bool eventFilter(QObject *obj, QEvent *event); public:
explicit Widget();
};

Widget::Widget() : label(this)
{
label.installEventFilter(this);
} bool Widget::event( QEvent * e)
{
if(e->type() == QEvent::MouseButtonPress)
{
QMouseEvent *me = dynamic_cast<QMouseEvent* >(e);if(me->button() == Qt::LeftButton)
{
QStringEvent event( QString("X坐标: %1 Y坐标: %2").arg(me->x()).arg(me->y()) );
QApplication::sendEvent(&label,&event); //发送自定义事件
}
} return QWidget::event(e);
} bool Widget::eventFilter(QObject *obj, QEvent *event)
{
QLabel *t = dynamic_cast<QLabel* >(obj); if(t && event->type()== QStringEvent::TYPE )
{
QStringEvent *str = dynamic_cast<QStringEvent* >(event);
t->setText(str->str());
t->adjustSize();
return true;
} return QWidget::eventFilter(obj,event);
}

效果:

 

19.QT-事件发送函数sendEvent()、postEvent()的更多相关文章

  1. QT事件

    qtevents多线程工作object存储 Another Look at Events(再谈Events) 最近在学习Qt事件处理的时候发现一篇很不错的文章,是2004年季刊的一篇文章,网上有这篇文 ...

  2. Qt 学习之路 2(19):事件的接受与忽略(当重写事件回调函数时,时刻注意是否需要通过调用父类的同名函数来确保原有实现仍能进行!有好几个例子。为什么要这么做?而不是自己去手动调用这两个函数呢?因为我们无法确认父类中的这个处理函数有没有额外的操作)

    版本: 2012-09-29 2013-04-23 更新有关accept()和ignore()函数的相关内容. 2013-12-02 增加有关accept()和ignore()函数的示例. 上一章我们 ...

  3. QT虚拟小键盘设计--qt事件循环,事件发送的理解

    有人讲到QT5.7及其以后的版本才自带免费的小键盘插件. QT5.10中关于QKeyEvent类:点击打开链接 QT sendEvent和PostEvent, 点击打开链接 my god,我今天安装了 ...

  4. accept()函数用来告诉Qt,事件处理函数“接收”了这个事件,不要再传递;ignore()函数则告诉Qt,事件处理函数“忽略”了这个事件,需要继续传递(看一下QWidget::mousePressEvent的实现,最为典型。如果希望忽略事件,只要调用父类的响应函数即可)

    QEvent的accept()和ignore()一般不会用到,因为不如直接调用QWidget类的事件处理函数直接,而且作用是一样的,见下面的例子. 推荐直接调用QWidget的事件处理函数.而不是调用 ...

  5. qt事件传递过程和处理

    处理监控系统的时候遇到问题,在MainWidget中创建多个子Widget的时候,原意是想鼠标点击先让MainWidget截获处理后再分派给子Widget去处理,但调试后发现如果子Widget重新实现 ...

  6. Qt事件机制浅析(定义,产生,异步事件循环,转发,与信号的区别。感觉QT事件与Delphi的事件一致,而信号则与Windows消息一致)

    Qt事件机制 Qt程序是事件驱动的, 程序的每个动作都是由幕后某个事件所触发.. Qt事件的发生和处理成为程序运行的主线,存在于程序整个生命周期. Qt事件的类型很多, 常见的qt的事件如下: 键盘事 ...

  7. Qt 事件机制

    [1]事件 事件是可以被控件识别的操作.如按下确定按钮.选择某个单选按钮或复选框. 每种控件有自己可识别的事件,如窗体的加载.单击.双击等事件,编辑框(文本框)的文本改变事件等等. 事件就是用户对窗口 ...

  8. 【转】QT事件传递与事件过滤器

        [概览] 1.重载特定事件函数.    比如: mousePressEvent(),keyPressEvent(),  paintEvent() .     2.重新实现QObject::ev ...

  9. Qt事件机制---信号通过事件实现,事件可以过滤,事件更底层,事件是基础,信号是扩展。

    转:http://www.cnblogs.com/findumars/p/8001484.html Qt事件机制(是动作发生后,一种通知对象的消息,是被动与主动的总和.先处理自己队列中的消息,然后再处 ...

随机推荐

  1. 字符转码开源库libiconv目前还不支持64位

    最新版的libiconv 1.14目前还不支持64位系统,只能编译出32位库. libiconv 1.14下载地址: http://ftp.gnu.org/pub/gnu/libiconv/libic ...

  2. (三十)PickerView文字和随机数的使用

    PickerView用于展示供选择的内容(例如日期选取.点菜等). 有三种情况: 1.每一列都是独立的选取 2.右边的列受到左边列的影响 3.包含图片 PickerView和TableView类似,通 ...

  3. AWR報告詳解

    AWR是Oracle  10g 版本 推出的新特性, 全称叫Automatic Workload Repository-自动负载信息库, AWR 是通过对比两次快照(snapshot)收集到的统计信息 ...

  4. LeetCode之“链表”:Sort List

    题目链接 题目要求: Sort a linked list in O(n log n) time using constant space complexity. 满足O(n log n)时间复杂度的 ...

  5. RubyGem默认源安装太慢,修改国内淘宝源

    原帖地址:http://www.hiceon.com/topic/Ruby-Gem-install-source-taobao/ WHY? 由于国内网络原因(你懂的),导致 rubygems.org ...

  6. Unity Web自适应浏览器

    unity web的自适应浏览器比我想象中要更简单,但是这里也只有更改最简单的东西实现了自适应.发布web时,在playersetting里面设置分辨率为你在Game窗口自定义的分辨率大小,以保证内容 ...

  7. WINCE之“系统事件”——System/Events

    1. 简介 Event--事件,相信有线程概念的编程人员都知道,它可以用来同步不同进程.不同线程的通信.在Windows CE 5.0系统中,有一种我称之为"系统事件"的Event ...

  8. 拆解轮子之XRecyclerView

    简介 这个轮子是对RecyclerView的封装,主要完成了下拉刷新.上拉加载更多.RecyclerView头部.在我的Material Design学习项目中使用到了项目地址,感觉还不错.趁着毕业答 ...

  9. Graph Cuts学习笔记2014.5.16----1

    进行了一段时间的论文学习后,现在下载了一些代码,准备从OpenCV跟matlab两个方面着手搭建自己的图像分割平台,计划耗时一个月左右的时间! 昨天去西工大,听了一场Graph Asia的报告,里面有 ...

  10. Django之Apps源码学习

    先了解下官方文档的介绍 Django包含了一个已经安装应用的注册表,这个注册表存储着配置信息以及用来自省,同时也维护着可用模型的列表. 这个注册表就是apps,位于django.apps下,本质上是一 ...