在QT中,可以通过信号-槽机制实现两个类之间的事件触发。但是c++中没有这样的机制。通过自定义event的方式,可以实现一个类对象通知事件的触发。
下面的例子是一个通过MySingleton的event触发MainWindow方法的实例。
①event类中通过重载+=和()运算符提供方法的注册和执行;
②MySingleton类中定义event变量,并提供runMethod()方法触发消息;
③在MainWindow中定义事件执行方法func并注册到event中;
④在MainWindow中通过按钮调用MySingleton类的runMethod()方法触发消息。
以下是关键部分代码:
1、定义event类
myevent.h
typedef void(FUNC_TYPE)(MyEventParam* event_args);
class MyEvent{
public:
MyEvent();
void operator+=(FUNC_TYPE*);
void operator()(MyEventParam* event_args);
QList<FUNC_TYPE*> m_methodList; };
myevent.cpp
void MyEvent::operator+=(FUNC_TYPE* pFunc) {
m_methodList.append(pFunc); }
void MyEvent::operator()(MyEventParam* event_args) {
FUNC_TYPE* pFunc;
for(int i=0;i<m_methodList.count();i++) {
pFunc = m_methodList.at(i);
pFunc(event_args); }
}
2、在MySingleton定义event变量
class TestParam : public MyEventParam {
public:
TestParam();
int m_id;
QString m_name;
};
public:
static MyEvent m_event;
void MySingleton::runMethod() {
TestParam mparam;
mparam.m_id = 0;
mparam.m_name = "test";
m_event(&mparam);
}
3、在MainWindow中注册event触发的方法
FUNC_TYPE* pFun = (void(*)(MyEventParam* event_args))func;
MySingleton::m_event += pFun;
4、在MainWindow中定义事件处理方法func
void MainWindow::func(MyEventParam* event_args) {
TestParam* mParam = (TestParam*)event_args;
qDebug() << "do function.id=" << mParam->m_id << " name=" << mParam->m_name;
}
5、在MainWindow中通过按钮触发MySingleton的事件
这里的触发可以放到任何类中进行,不一定是在MainWindow中。
void MainWindow::on_pushButton_clicked() {
MySingleton::getinstance()->runMethod();
}
执行效果:
讨论QT技术问题可加QQ群:462331087