OpenCV+PyQT5开发桌面应用几个重要的坑与解决

描述

PyQT5+OpenCV开发


大概去年八月份的时候,我打算用OpenCV+PyQT5开发一套OpenCV教学演示与快速验证桌面软件,说实话那个时候我对PyQT5的理解就是Hello World水平。经过一年多开发锤炼,不断实践,我感觉是熟练掌握了界面组件与布局组件应用、事件响应、多线程与数据传输、各种绘图与绘制控件编程技巧、应用发布打包等环节,完成了这套教学软件的开发与测试,并且已经支持Windows、Ubuntu、Jetpack等平台运行,而且全部通过测试。下面就放几张核心产品的图片

OpenCV

OpenCV

OpenCV


三个最重要坑


开发过程遇到最大的两个个坑就是事件重复响应与界面控件无法响应键盘输入,最终这两个问题是都解决了。在部署阶段,在不同操作系统Windows、Ubuntu、Jetpack兼容性测试遇到最大的一个坑就是PyQT5版本支持的问题。这个通过仔细分析原因也得到解决。这几个问题网上都有各自不正确,不彻底的解决方法,无法真正解决这些问题,而我是彻底的解决这三个典型问题,这里分享一下经验,避免大家踩坑。  


01PyQT5槽函数多次响应执行的问题


典型的就是点击按钮多次执行槽函数,网上很多的解决方法就是添加

 

# disconnect/connect
def solution_bad():
        mybutton.disconnect()
        mybutton.clicked.connect(my_func)

这种方法只是治标不治本,真实的原因是因为你的组件多次绑定槽函数了,桌面应用程序开发在多个界面之间切换的时,特别要小心注意这点。后来我都是帮事件绑定槽函数单独写在一个方法里面,确保只调用一次!例如:

 


02UI组件无法响应键盘输入


界面上QLineEdit/QSpinbox等组件统统无法响应键盘输入了,重新自己写一个简单的例子可以,在桌面应用程序中不行,无法输入。但是我发现一个奇怪方法可以让QLineEdit/QSpinbox等组件支持输入,就是安装“谷歌输入法”,其它输入法我都测试过,根本还是无法输入,最终找到的原因是PyQT5中Widget界面键盘交互是有函数支持的,当桌面应用程序切换时候时候,必须先释放当前的键盘绑定,然后在切换后的键盘中才可以使用,否则就会发生输入UI组件一直无法响应键盘输入,这个在Windows/Ubutun/Jetpack上都一样,亲测如此,解决的方法很简单,在切换操作之前添加释放键盘的函数调用就可以了。总计两行代码完成。贴一下如下:

OpenCV

OpenCV


第一行放在构造函数里面,第二行放在你切换之前。就这样完美解决了!  

但是这个问题困扰了我几个月,原因是各种教程里面不会涉及这么复杂的UI切换跟开发,但是你开发桌面应用程序就会涉及,所以遇到了这个问题之后,网上都没有答案,最后我自己觉得是键盘输入问题,无意中搜索到官方文档看到这两个方法,灵机一动,发现惊喜了!所以遇到问题,一定先搜索一下官方的API开发文档,搜索关键字!

03排版是门技术活


在Ubutun系统上运行时候发现一直有下面的错误:

qt.qpa.plugin:Could not load the Qt platform plugin “xcb”



正常情况下安装相关lib之后即可解决,但是如果你安装OpenCV4.5.x版本,则会一直遇到这个错误,无论是Ubutun18/ Ubutun20,网上提供的解决方案都是把OpenCV版本回退到4.3.1之前。  

我仔细分析了错误信息跟安装的苦支持信息,发现原因是PyQT5安装版本跟支持库版本不一致导致的冲突问题,我把PyQT5版本从5.15改成5.12成功解决这个错误,而且OpenCV可以直接用最新版本。  

这几个是让我印象特别深刻的错误,每个都是多方查证,分析之后解决的。欢迎在下面留言分享你用PyQT5开发遇过的那些让你印象深刻的坑与解决方法!  

总结:

通过开发这款软件的经验积累与知识整理,现在有个人想要学习PyQT5桌面应用程序开发,我三个月肯定能让他达到我现在的水平,这个就是经验跟系统化学习之后总结出来的好处!让后来人少走弯路,少踩坑!  

针对上述三个问题,如果你有更好的解决方案,欢迎留言评论!

 

  审核编辑:汤梓红

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分