当前位置: 首页 > news >正文

《QT从基础到进阶·四十三》QPlugin插件多线程问题和只有插件dll没有头文件和lib文件时调用插件中的方法

1、插件和多线程问题:
创建插件对象不能放到多线程执行,不然报错:ASSERT failure in QWidget: "Widgets must be created in the GUlthread.

//不能放在多线程执行
QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName));
QObject* plugin = pluginLoader.instance();

解决办法:把创建插件的对象写到一个方法里,然后把这个方法强制塞入主线程执行。

QMetaObject::invokeMethod(qApp, [this]() {  //对象不是静态
QMetaObject::invokeMethod(qApp, []() {   //对象是静态

下图中m_PluginCore是静态指针
getinstance方法会在多线程执行,但loadPlugin会被强制塞入主线程执行,执行完毕继续多线程执行下面的代码
在这里插入图片描述

2、插件都会被创建为QObject*对象,怎么通过QObject*直接调用插件基类中的方法(这种方式也实现了只有插件dll,没有头文件也能调用插件中的方法)
假如插件基类有个纯虚函数virtual QWidget* getWidget()=0;
现通过QObject*直接调用getWidget

第一步:插件实现纯虚函数时把方法通过 Q_INVOKABLE 宏注册到 Qt 的元对象系统中,即在方法前加Q_INVOKABLE

Q_INVOKABLE QWidget* GetWidget(){....}

第二步:

//获取插件对象的元对象
const QMetaObject* metaObject = plugin->metaObject();
//获取方法索引。如果返回值为 -1,则说明没有找到该方法
int methodIndex = metaObject->indexOfMethod("GetWidget()");
if (methodIndex != -1) {//获取方法QMetaMethod method = metaObject->method(methodIndex);// 调用插件中的方法QWidget* result = nullptr;// 判断方法是否调用成功,如果成功可以获取到result指针,success返回truebool success = method.invoke(plugin, Q_RETURN_ARG(QWidget*, result));
}
在这里插入图片描述
http://www.lryc.cn/news/393021.html

相关文章:

  • Android SurfaceFlinger——屏幕状态初始化(二十二)
  • 3101. 交替子数组计数 Medium
  • Linux系统基础命令行指令——Ubuntu
  • qt 读取配置文件
  • 拉格朗日插值法【python,算法】
  • 定个小目标之刷LeetCode热题(41)
  • Kotlin中的关键字
  • LabVIEW新能源汽车电池性能测试系统
  • Elasticsearch 实现 Word、PDF,TXT 文件的全文内容提取与检索
  • 深度学习赋能数据分析,联蔚盘云引领业务革新
  • Arthas实战(5)- 项目性能调优
  • 昇思25天学习打卡营第7天|Pix2Pix实现图像转换
  • 单选多选提交问卷,代码示例
  • mars3d加载wms服务或者wmts服务注意事项
  • 【机器学习】机器学习与自然语言处理的融合应用与性能优化新探索
  • ubuntu优化
  • 使用 HBuilder X 进行 uniapp 小程序开发遇到的问题合集
  • Python爬虫获取视频
  • Python自动化,实现自动登录并爬取商品数据,实现数据可视化
  • 计算机网络——数据链路层(以太网)
  • Java ORM框架FastMybatis踩坑
  • AI是在帮助开发者还是取代他们?
  • C. Theofanis‘ Nightmare
  • 加密货币大利好!9月降息概率突破70%!美国可能大幅降息或多次降息?
  • Dns被莫名篡改的逆向分析定位(笔记)
  • SpringBoot中整合ONLYOFFICE在线编辑
  • Python打字练习
  • Pytorch添加自定义算子之(10)-mmdeploy编译流程
  • 大数据面试题之Flink(4)
  • C#实战|账号管理系统:通用登录窗体的实现。