QtExamples/QtEvent/main.cpp
2021-07-08 01:19:34 +08:00

108 lines
3.6 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//#include <QApplication>
//#include<QWidget>
//#include<QObject>
//#include <iostream>
//using namespace std;
//QEvent::Type t1=(QEvent::Type)1333;
//QEvent e(t1); //使用 QEvent 的构造函数在堆栈上创建自定义事件
//class E:public QEvent
//{public: //子类化 QEvent 以创建自定义事件
// //方式 1使用静态成员。
// //使用静态成员主要是为了正确初始化父类部分 QEvent比如
// //E():t2((QEvent::Type)1324),QEvent(t2){},若 t2 不是静态的,则则初始化之后 t2 为 1324但传递
// //给 QEvent 的 t2 是一个不确定的值,因为按照 C++规则,对父类部分的初始化先于数据成员的初始化。
// static QEvent::Type t2; //注意:不要使用名称 t因为 QEvent 类之中有一个名称为 t 的成员变量。
// E():QEvent(t2){}
// //方式 2使用带一个参数的构造函数
// QEvent::Type t3;
// explicit E(QEvent::Type t4):t3(t4),QEvent(t4){}
//};
//QEvent::Type E::t2=(QEvent::Type)1334;
//class A:public QWidget
//{public:
// bool event(QEvent* e){ //重写 event 函数以处理自定义事件
// if(e->type()==t1) //判断事件类型是否为 t1
// {cout<<"AE"<<e->type()<<",";
// f1((E*)e); //调用自定义的处理函数处理该事件
// return 1; }
// if(e->type()==E::t2) {cout<<"BE"<<e->type()<<","; f2((QEvent*)e); return 1; }
// if(e->type()==((E*)e)->t3){cout<<"CE"<<e->type()<<","; f3((E*)e); return 1;}
// return QWidget::event(e);
// } //event 结束
// //以下为处理自定义事件的事件处理函数
// void f1(E *e){cout<<"F1"<<endl;}
// void f2(QEvent *e){cout<<"F2"<<endl;}
// void f3(E *e){cout<<"F3"<<endl;}
//}; //类 A 结束。
//int main(int argc, char *argv[])
//{ QApplication aa(argc,argv);
// A ma; E me; E *pe=new E((QEvent::Type)1335);
// //发布或发送事件
// aa.sendEvent(&ma,&e); aa.sendEvent(&ma,&me); aa.postEvent(&ma,pe);
// //aa.postEvent(&ma,&me); //错误,发布的事件 me 必须是在堆上创建的。
// ma.resize(333,222);
// ma.show(); aa.exec(); return 0;
//}
//---------------------------------------------------------------------------------------------------------
//示例:使用事件过滤器处理自定义事件
#include <QApplication>
#include<QWidget>
#include<QObject>
#include <iostream>
using namespace std;
QEvent::Type t1=(QEvent::Type)QEvent::registerEventType(1333);
QEvent e1(t1); //使用 QEvent 的构造函数创建自定义事件
//t2 的值与 t1 重复,使用 registerEventType 会自动产生一个合法的值
QEvent::Type t2=(QEvent::Type)QEvent::registerEventType(1333);
QEvent e2(t2);
class A:public QWidget{public:
bool event(QEvent* e){
if(e->type()==t1) {
cout<<"AE"<<e->type()<<",";
f1((QEvent*)e);
return 1;
}
if(e->type()==t2) {
cout<<"BE"<<e->type()<<",";
f2((QEvent*)e);
return 1;
}
return QWidget::event(e);
} //event 结束
void f1(QEvent *e){cout<<"F1"<<endl;}
void f2(QEvent *e){cout<<"F2"<<endl;}
};
class B:public QObject{public:
bool eventFilter(QObject *w, QEvent *e){
if(e->type()==t1){
cout<<"A"<<endl;
return 1;
}
if(e->type()==t2){
cout<<"B"<<endl;
return 0;
}
return 0;}
};
int main(int argc, char *argv[]){ QApplication aa(argc,argv);
A ma; B mb;
ma.installEventFilter(&mb); //安装事件过滤器
aa.sendEvent(&ma,&e1);
aa.sendEvent(&ma,&e2);
ma.resize(333,222);
ma.show();
aa.exec();
return 0; }