创建用户事件

创建一个自定义类型的事件,首先需要有一个事件号,其值通常大于QEvent::User。
为了传递事件信息,因此必须编写自定义的事件类,该事件类从QEvent继承。

编写用户事件:
编写用户事件类的方法是首先定义一个事件号。
然后实现用户事件类,应用程序将把用户事件类于Qt的事件类同等处理。

//用户事件类QOriCodeEvent头文件qoricodeevent.h 
#include <QEvent>
#define ORI_DIS_EVENT QEvent::User+12

class QOriCodeEvent : public QEvent  
{
public:
    QOriCodeEvent();
public:
    int m_len;
    char m_data[255];
};

//用户事件类QOriCodeEvent实现文件qoricodeevent.cpp
#include "qoricodeevent.h"

QOriCodeEvent::QOriCodeEvent()
    : QEvent( Type(ORI_DIS_EVENT) )
{
    //实现比较简单,随机获得指定长度的源码
    m_len = rand()%150 + 50;
    //0xeb 0x90 表示起始头,其他数据随机产生的。
    m_data[0] = 235;
    m_data[1] = 144;
    for (int i = 2; i < m_len; i++)
        m_data[i] = rand()%255;
}

事件发送
应用程序都要创建并发送自定义事件,因此先创建一个相应的事件类的对象,然后将事件发送。
QCoreApplication::sendEvent()、QCoreApplication::postEvent()都能完成事件发送操作。
senEvent()、postEvent()区别不用多说了吧~和Mfc中的SendMessage()、PostMessage()差不多。
只是postEvent()是投寄事件到一个队列,以便迟缓分发。

发送用户事件:
这里为了简化实例,只在一个线程中定时发送,当然也可以在定时器事件中完成。
但由于用户事件不一定时时触发,最好还是定义个全局的QWaitCondition对象,通过wait()、wakeOne()来触发事件在线程中的发送。
QWaitCondition的相关内容留在以后写Qt线程中在讲解吧~

//发送源码线程QOriThread头文件qorithread.h
#include <QThread>
class QOriThread : public QThread
{
public:
    QOriThread();
    virtual ~QOriThread();
    void run(); 
private:
    bool m_sign;
};

//发送源码线程QOriThread实现部分qorithread.cpp
#include "qoricodeevent.h"
#include "orithread.h"
#include <QApplication>
#include <mainwindow.h>
extern MainWindow *pMainwindow;

OriThread::OriThread()
{
}

OriThread::~OriThread()
{
    m_sign = true;
    wait();
}

void OriThread::run()
{
    m_sign = false;
 
    while(true)
    {
        if(m_sign)
            break;
        QOriCodeEvent *event = new QOriCodeEvent();
        //pMainwindow是主窗口类的指针
        qApp->postEvent( (QObject*)pMainwindow->textView, event);
        sleep(1);
    }
}

事件处理
有5种不同的处理事件的方法,如下
1、重载函数QCoreApplication::notify()可提供有效的事件控制,但仅能在派生于QCoreApplication、QApplication的类中重实现这个函数。
2、在qApp(是QApplication的全局实例)中实现事件过滤,这样的一个事件过滤器能为所有的widget处理所有的事件,而且可以有超过一个全局应用程序的事件过滤器。如鼠标事件的全局事件过滤器设置了鼠标跟踪事件,则鼠标移动事件对于所有widget有效。
3、重载QObject::event()(在QWidget类中)在任何widget特定的事件过滤器之前可看到所有事件。
   这个虚函数接收一个对象的事件,如果事件被识别并被处理,将返回true。这个函数能被用来重实现一个对象的行为。
4、在对象上安装事件过滤器。
5、重载Qt基类事件处理函数。
   当用户发现Qt基类的事件处理函数不能满足需要时,可以在用户类中重载这些函数。对于特定的Qt事件,可以重载特定的事件函数,如重载paintEvent()、mousePressEvent()等函数。

处理用户事件:
如果想处理多个Qt事件处理函数,可以通过重载QObject::event()来实现。
但这个我们是要处理的是自定义用户事件,这个要重载的是QObject::customEvent()。

//上面的textView就是QOriTextView类的对象。头文件qoritextview.h 
#include "qoricodeevent.h"
#include <QTextEdit>

class QOriTextView : public QTextEdit  
{
public:
    QOriTextView(QWidget* parent = 0);
    void ClearBuf();
    QTextDocument *document;

protected:
    void customEvent( QEvent *event );
 
private:
    QVector<QString> m_oriTextList;
};

//QOriTextView类实现部分qoritextview.cpp
#include "qoritextview.h"

QOriTextView::QOriTextView(QWidget* parent)
    :QTextEdit(parent)
{
    m_oriTextList.clear();
    document = new QTextDocument(this);
    //设置字体
    QFont font = document->defaultFont();
    font.setPointSize(11);
    document->setDefaultFont(font);
    document->setUseDesignMetrics(true);
    //设置背景色黑色
    setPalette(Qt::black);
    setDocument(document);
    //设置滚动条暗灰色
    verticalScrollBar()->setPalette(Qt::darkGray);
    //文本形式为只读
    setReadOnly(true);
    setUndoRedoEnabled(true);
}

void QOriTextView::ClearBuf()
{
    clear();
    m_oriTextList.clear();
}

void QOriTextView::customEvent( QEvent *event )
{
    int type = event->type();
    if ( type == ORI_DIS_EVENT ) 
    {  
        //将QOriCodeEvent发来的数据写到oriText中。
        QString oriText;
        for(int i=0; i<((QOriCodeEvent*)event)->m_len; i++)
        { 
            QString tempStr;
            tempStr.sprintf("%02X ", (unsigned char)(((QOriCodeEvent*)event)->m_data[i]));
            oriText += tempStr;
        }
        //设置文本字体颜色白色
        setTextColor(Qt::white);
        append(oriText);
        m_oriTextList.push_back(oriText);
        //当数据大于15条后,清除顶方数据
        if (m_oriTextList.count() > 15)
        {
            QTextCursor cursor(document);
            if (cursor.isNull())
            {
                cursor.movePosition(QTextCursor::Start);
                cursor.movePosition(QTextCursor::NextBlock, QTextCursor::KeepAnchor);
                cursor.deleteChar();
                m_oriTextList.pop_front();
            }
        }
        //滚动条始终在最下面
        QScrollBar *vScrollBar = verticalScrollBar();
        qreal high = vScrollBar->maximum() - vScrollBar->minimum() + vScrollBar->pageStep();
        vScrollBar->setSliderPosition(vScrollBar->maximum());
        event->accept();
    }
}

转自:http://cool.worm.blog.163.com/blog/static/6433900620084632410879/

http://blog.csdn.net/leo115/article/details/7403033

Qt 自定义事件详细实例(继承QEvent,然后QCoreApplication::postEvent()、sendEvent())的更多相关文章

  1. Qt 自定义事件(三种方法:继承QEvent,然后Send Post就都可以了,也可以覆盖customEvent函数,也可覆盖event()函数)

    Qt 自定义事件很简单,同其它类库的使用很相似,都是要继承一个类进行扩展.在 Qt 中,你需要继承的类是 QEvent. 继承QEvent类,你需要提供一个QEvent::Type类型的参数,作为自定 ...

  2. Qt 自定义事件的实现

    初学Qt,用了Qt自带的事件,然后想怎么才能定义自己的事件呢?又如何使用自定义事件呢?看了篇文章,说先要子类化QEvent,然后定义自己的QEvent::Type,然后重写QWidget::event ...

  3. Qt 自定义事件

    Qt 自定义事件很简单,同其它类库的使用很相似,都是要继承一个类进行扩展.在 Qt 中,你需要继承的类是 QEvent. 继承QEvent类,你需要提供一个QEvent::Type类型的参数,作为自定 ...

  4. Qt自定义事件的实现(转)

    原文:http://blog.csdn.net/michealtx/article/details/6866094 初学Qt,用了Qt自带的事件,然后想怎么才能定义自己的事件呢?又如何使用自定义事件呢 ...

  5. Qt自定义事件的实现(军队真正干活,但要增加监军,大平台通知事件,事件内容自定义)

    初学Qt,用了Qt自带的事件,然后想怎么才能定义自己的事件呢?又如何使用自定义事件呢?看了篇文章,说先要子类化QEvent,然后定义自己的QEvent::Type,然后重写QWidget::event ...

  6. 组件自定义事件(.sync)实例

    <div id="root"> <parent></parent> </div> var childNode = { templat ...

  7. Qt 学习之路:自定义事件

    尽管 Qt 已经提供了很多事件,但对于更加千变万化的需求来说,有限的事件都是不够的.例如,我要支持一种新的设备,这个设备提供一种崭新的交互方式,那么,这种事件如何处理呢?所以,允许创建自己的事件 类型 ...

  8. Qt 学习之路 2(23):自定义事件

    Qt 学习之路 2(23):自定义事件  豆子  2012年10月23日  Qt 学习之路 2  21条评论 尽管 Qt 已经提供了很多事件,但对于更加千变万化的需求来说,有限的事件都是不够的.例如, ...

  9. 分享一个C#自定义事件的实际应用

    在C#.NET的开发中,事件是经常接触到的概念,比如为按钮添加点击事件,并写入点击按钮触发事件要运行的代码.不管是ASP.NET还是WinForm等各种形式的应用程序,最经常是为系统生成的事件写具体代 ...

随机推荐

  1. 阵列卡,组成的磁盘组就像是一个硬盘,pci-e扩展出sata3.0

    你想提升性能,那么组RAID0,主板上的RAID应该是软RAID,肯定没有阵列卡来得稳定.如果你有闲钱,可以考虑用阵列卡. 不会的.即使不能起到RAID的作用,起码也可以当作直接连接了2个硬盘.不会影 ...

  2. 【czy系列赛】czy的后宫6 && bzoj1044 [HAOI2008]木棍分割

    题目描述 众所周知的是丧尸czy有很多妹子(虽然很多但是质量不容乐观QAQ),今天czy把n个妹子排成一行来检阅.但是czy的妹子的质量实在--所以czy看不下去了.检阅了第i个妹子会增加czy a[ ...

  3. thinkpad t530 centos 6.4 有线网卡 设置

    由于新装的系统没有安装网卡驱动,各大厂商的标准又不一样,有的电脑在linux下不用安装无线网卡驱动,而很不幸,我的电脑是ret的网卡,只能自行安装,在安装无线网卡的过程中使用到了chkconfig的命 ...

  4. Java通过JNI调用C/C++

    From:http://www.cnblogs.com/mandroid/archive/2011/06/15/2081093.html JNI是JAVA标准平台中的一个重要功能,它弥补了JAVA的与 ...

  5. poj 2096 Collecting Bugs(期望 dp 概率 推导 分类讨论)

    Description Ivan is fond of collecting. Unlike other people who collect post stamps, coins or other ...

  6. ubuntu 右键新建文档

    第一步.创建一个空白doc文档. 一定要是空白的,然后保存(另存为)到桌面,注意细节:1.保存到你能找到的地方,最好是桌面,以方便第二步拖动 2.注意下方的 “文件类型”,要选择doc格式. 3.注意 ...

  7. Hacker(13)----搜集目标计算机的重要信息

    扫描与嗅探攻防 黑客若要发起入侵攻击,他需要做好充分的准备的工作,首先通过嗅探和扫描等操作来搜索信息,从而确定目标计算机,以便准确发出攻击.嗅探和扫描操作可以利用专业的软件工具实现,如X-Scan.S ...

  8. PHP学习笔记三十一【const】

    <?php //常量都是public类型 // const 常量名=赋值 .变量名不需要加$符号,也不需要要访问修饰符,默认就是public class A{ const TAX_RATE=0. ...

  9. 最近因为textview高度问题疯了疯了疯了

    1.textview有\r\n什么的就算不明白,我的文本最后一个字符是\r,结果我死活算不对,最后发现了==! NSString * str = [_messageModels[indexPath.r ...

  10. textView富文本点击事件

    NSDictionary * attDic = [NSDictionary dictionaryWithObjectsAndKeys:RGBCOLOR(31, 132, 204),NSForegrou ...