由于QCoreApplication全局单例,因此可以利用其作为媒介进行模块间通信。
#define qApp (static_cast<QApplication *>(QCoreApplication::instance()))
例如现在有一个主框架Main,包含了两个界面Widget,现在需要当点击WidgetA中的某个控件时,框架会切换到widgetB界面且进行相关操作。
1.WidgetA
利用setProperty设置相关要传输的数据,并调用sendEvent发送事件。
int type = 10000;
QVariantList al;
void *sd;//相关数据
val.setValue(sd);
al.append("WidgetB_Open");
al.append(val);
qApp->setProperty("PLUGINEVENT",al);
qApp->sendEvent(qApp, &QEvent((QEvent::Type)type));
qApp->setProperty("PLUGINEVENT", QVariantList());
- MyApplication
继承Application派生出MyApplication,重写event(QEvent *e)来实现对上述WidgetA发送事件的处理。
bool MyApplication::event(QEvent *e)
{
int tmp = e->type();
if (tmp == 10000)
{
QVariantList params = qApp->property("PLUGINEVENT").value<QVariantList>();
auto pluginList = cPluginManager::getInstance()->getLoadedPlugins();
for (auto item : pluginList)
{
item->recEvent(params);
}
}
return QApplication::event(e);
}
在不同的模块中分别重写recEvent,即可完成对其他模块事件的响应。
3.WidgetB
QString title = dataList.value(0, QVariant()).toString();
if (title == "WidgetB_Open")
{
auto plugin = (PluginKHDesign*)pluginPageGroup[PLUGIN_NAME];
if (plugin)
{
、 //...
}
}