weixin_37653181 2019-03-28 09:57 采纳率: 0%
浏览 479

Qt导入MFC工程的lib库和dll等库之后,编译出现错误,如何解决?

图片说明

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-09-20 19:21
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:
    • 请看👉 :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