QT5和python3结合你想不到坑

使用Qt5+python3实现一个word和Excel操作的一个工具,新手入坑,坑死人不偿命。

c++操作word和Excel

作为一个接触c++只有一个月的新手人员,一直想写应用的小工具,验收一下学习成果,刚好赶着项目需要,最近在修改大量的交付文档,就萌发一个用c++编写工具的想法:

  1. 网上搜索确实有很多方法,看了下网上的资料,发现对于我们这种小西米看着头痛;
  2. c++调Word是可以实现,但是没有一个很好的库或之类的什么都要自己写,而且实现一个小功能要写一个很长的代码,看着别人写好的都难受,所以果断放弃;
  3. 因为自己对python接触的早所以,所以萌发了用python来调Word,搜索python调word,太多资料了;而且代码简洁易懂,不用去关系word提供的原始api,直接在上层调用,爽的一比;

c++调python

网上代码很多,很快就用python写好对word等文件的操作的脚本,下面就是坑中坑,然后想写个图形界面封装一下,想想就用qt,正好电脑上有QT5的环境,由于第一次鬼知道我经历是什么:
环境搭建
电脑上python3,写好的脚本也是python3直接跟着网上资料进行配置吧https://www.e-learn.cn/content/python/1322577;

  1. 由于脚本放置的位置错误造成找不到模块;我的地址是这样设置的那么脚本应该放置在python3源码根目录不然找不到就报导入错误
  2. 由于出现了问题我决定用一个test.py文件来测试基本的qt调c++,修改了路径,文件也放的正确怎么也没有效果,我怀疑是电脑坏了,各种重启。网上搜了半天鬼知道什么原因;
    QT5和python3结合你想不到坑_第1张图片
  3. 还有一个小坑,就是python3的版本位数一定要和编译器的版本匹配,不让也要报错;
    QT5和python3结合你想不到坑_第2张图片
    操作应用
    1. 由于我我写好的python文件是一个类,而且类中还有初始化,网上的资料都没有对类进行初始化;
      QT5和python3结合你想不到坑_第3张图片
  4. 这可以对python的类进行初始化并传入word地址参数;
    QT5和python3结合你想不到坑_第4张图片
  5. 我编写的c++调python3三个参数,三个参数涉及到中文等字符问题,最大的坑来了;

Qstring到string到char*,各种问题,界面收到的是Qstring需要转到char*才能传入python中
一定要注意不能乱码啊之类,出现到网上去找资料,文件的默认编码亦可能造成报错
6. qtcreator也有坑,编译时候一定要清除后再编译,如果确认没问题建议你重启下电脑之类,把其他编译文件或qmake文件删除后重新编译;
7. 最坑的问题来了:在这里插入图片描述之前都是好的,过了几天死活运行不起,没办法用这个类去创建python对象。期间各种换环境,甚至把虚拟机都装上了。最后也没有找到原因,纠结几天也没有找到原因,最后不得已只有屈服,将原本python类在上层封装一个函数,c++中直接通过函数去调用;

多线程调python脚本

  1. c++中我用循环去调python脚本执行word操作,但是返回结果始终存在一个或两个失败;没有管它,但这样的效率太低了,准备把循环替换成多线程提高效率。我选了qt中高级库QT5和python3结合你想不到坑_第5张图片

    这个线程操作比较上层我选择了它,调用的会根据参数自己去匹配。比较方便
    在这里插入图片描述
    接下就是问题了来了,死活不行一调,程序就挂,还报出来一个GIL的库,恍然大悟,python全局解释性锁同一时间只允许一个线程操作python解释器。于是对着问题去网上一搜很快解决,需要解锁,要允许多线程操作python脚本;

这个是加在python初始化的时候
QT5和python3结合你想不到坑_第6张图片
终于完成了,可以调用了。把全局锁关闭后,发现之前不是出现的循环调用的时候返回错误的问题也一并解决了,就是因为GIL的问题,其实循环调用也是一样,c++调python本来就开线程去调用,所以一并解决哦了

总结环境搭建是一个坑,还有就是对很多东西不熟悉,而且我用的都是比较新的环境网上资料少的很,需要运气解决,不过最终我实现一个小工具能对Excel和word等文件使用qt去操作它,虽然现在只实现一键替换文件夹中所有文件名和文件内容的字符,但只要通了有需要还可以慢慢研究。。。。。python转c++这条路太长了,慢慢学习吧

你可能感兴趣的:(学习)