Qt:利用qApp进行插件化模块通信

由于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());
  1. 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)
		{//...
		}
	}
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值