1.问题现象:
使用QT 5.14.1编写的程序,需要截取整个桌面,在Windows下是正常的,在Mac下如果只有一个显示器是正常的,多个显示器的情况下有可能会崩溃。Mac OS会提示Float Point Exception,除0异常。且该异常无法利用程序try-catch进行捕获。
2.问题分析:
抓取桌面图像,使用QApplication::primaryScreen()->grabWindow(0)方式进行截取。在Mac OS系统下截取过程中发生除0异常,并且这个异常很特殊,就是单显示器情况下不会发生,只有多显示器的某种情况下会发生。具体何种情况下呢?就是如果在系统显示器设置中,如果将外接显示器设置为主显示器的时候会崩溃。通过看源码发现,grabWindow()方法中,存在计算两个矩形交集的运算,如果将外接显示器设置为第一个显示器的时候,就会导致计算矩形交集的width=0,而通过分析源码中刚好有除以width的计算,从而导致了该grabwindow()在这种情况下崩溃。
3.解决办法:
1)修改这部分源码,重新编译libqcocoa.dylib库
2)好像5.15版本应该解决了这个问题;
3)截屏钱判断是否存在多个屏幕,多了不让截。