qt自定义事件

       1. 继承QEvent类,不用定义Q_OBJECT宏,
           注意QEvent的构造函数有个枚举类型的QEvent::Type参数,表明事件类型,
           对于自定义类型,这个枚举值应该在1000~65535之间,
           推荐使用int QEvent::registerEventType()静态方法获取一个系统分配的事件类型,
           该函数返回值会在1000~65535之间。
        2. 调用静态方法QCoreApplication::postEvent(QObject *receiver, QEvent *event, int priority)
           receiver为事件接收者,event为自定义事件对象,priority优先级一般采用默认值即可
           调用postEvent的线程和receiver可以在同一个线程中,也可以在不同的线程中
           举例:QCoreApplication::postEvent(&mainWindow,new MyEvent());
           不用担心MyEvent的释放问题,在接收线程中会帮忙释放该对象,
           可以在MyEvent的析构函数中打断点跟踪自定义事件是如何被释放的。
        3. 重载事件接受者的event方法
           根据事件类型,判断如果是自定义的事件,就处理并返回true,
           否则,调用父类的event方法并返回。
        举例:            
            1.  创建Qt Widgets Application
            2.  自定义事件
                #include <QEvent>
                class MyEvent : public QEvent
                {
                public:
                    MyEvent(int data);
                    ~MyEvent();
                    int data() {return _data;}
                private:
                    int _data;
                };
                MyEvent::MyEvent(int data) : QEvent(QEvent::Type(1001))
                {
                    _data = data;
                }
            3.  创建线程,在线程中发送事件
                #include<QThread>
                #include <QWidget>
                class MyThread : public QThread
                {
                public:
                    MyThread(QWidget *main_window);
                protected:
                    void run();
                private:
                    QWidget* _pmw;  //事件接收者
                };
                #include <QCoreApplication>
                MyThread::MyThread(QWidget *main_window)
                {
                    _pmw = main_window;
                }
                void MyThread::run()
                {
                    while(_pmw)
                    {
                        sleep(3);
                        QCoreApplication::postEvent(_pmw,new MyEvent(2));
                    }
                }

           4.  重载接受者MainWindow的event方法
                bool MainWindow::event(QEvent *event)
                {
                   if(event->type() == 1001)
                   {
                       MyEvent* e = static_cast<MyEvent*>(event);
                       //处理自定义事件
                       return true;
                   }
                   return QMainWindow::event(event);
                }
            5.  main函数中:
                #include "myevent.h"
                #include "mythread.h"
                int main(int argc, char *argv[])
                {
                    QApplication a(argc, argv);
                    MainWindow w;
                    w.show();
                    //a.postEvent(&w,new MyEvent(3)); 本线程发送自定义事件
                    MyThread t(&w);  //新线程中发送自定义事件
                    t.start();
                    return a.exec();
                }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值