1条回答 默认 最新
关注 不知道你这个问题是否已经解决, 如果还没有解决的话:- 请看👉 :DLL中封装Qt窗口给MFC或Qt应用程序调用,并将DLL中的窗口嵌入主程序中,实现与主程序交互和自身事件循环的解决方案
- 除此之外, 这篇博客: DLL中封装Qt窗口给MFC或Qt应用程序调用,并将DLL中的窗口嵌入主程序中,实现与主程序交互和自身事件循环的解决方案中的 2、MFC作为主程序调用dll 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
我们知道,一般性的Qt应用程序,是有自己的事件循环,在main()函数中,一般情况下会这样写代码:
int main(int argc, char *argv[]) { QApplication a(argc, argv); QWidget w; w.show(); return a.exec(); }
当调用a.exec()后,主程序就会阻塞在这里,并且开启Qt自身的消息循环和处理。那么如果想在dll中嵌入Qt界面并实现Qt正常的工作,就必然少不了在dll中实现Qt事件循环,包括QApplication::exec()的调用。
所以在MFC调用dll之前,dll不仅仅是需要创建内部的Qt界面或者控件,而且也需要开启Qt的事件循环,最简单的方法就是开启单独的一个线程,用来作为Qt的事件循环。具体的实现就是初始化dll的接口中开启一个线程,在该线程中实现如下代码:
int argc = 1; TCHAR targv[MAX_PATH] = { 0 }; GetModuleFileName(NULL, targv, MAX_PATH); USES_CONVERSION; std::string strPath = T2A(targv); char argv[MAX_PATH]; memcpy(argv, strPath.c_str(), strPath.length()); char* pargv = argv; QApplication* a= new QApplication(argc, &pargv); // 这里创建dll内部的Qt界面例如QWidget QWidget w; w.show(); a.exec();
当调用a.exec()之后,该线程就被阻塞在这里,该线程就是实现QWidget的事件循环的线程动力。当需要结束这个事件循环,或者关闭这个dll中界面时,我们需要调用a->quit();来结束QApplication。
以上是MFC作为主程序来调用dll的实现。
如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^解决 无用评论 打赏 举报
悬赏问题
- ¥60 求一个简单的网页(标签-安全|关键词-上传)
- ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
- ¥15 基于卷积神经网络的声纹识别
- ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
- ¥100 为什么这个恒流源电路不能恒流?
- ¥15 有偿求跨组件数据流路径图
- ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
- ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
- ¥15 CSAPPattacklab
- ¥15 一直显示正在等待HID—ISP