最近项目需要使用qt实现截图功能,再次记录一下,希望对您有所帮助,qt我是用的是5.9.9版本。
1.截图
qt截图推荐使用QScreen来实现截图,使用grab这种方式只能截窗体且窗体如果是opengl窗体或者视频窗体无法获取数据。
1.截主屏幕
截主屏幕代码相对简单
QScreen* screen = QApplication::primaryScreen();
QPixmap pixmap = screen->grabWindow(QApplication::desktop()->winId(),
offsetX,
offsetY,
screenwidth,
screenheigh);
第一个参数也可以传递为NULL,这样默认截主屏幕。
也可以截窗口,第一个参数传递窗口的winId,注意如果窗口是opengl窗口或者播放视频的窗口截图会失败。
2.截图支持扩展屏
要接扩展屏就不能使用
QApplication::primaryScreen();
获取QScreen对象了,需要找到屏幕对应的QScreen,首先根据窗口找到屏幕编号,然后找到对应的QScreen如下:
int screenNumber = QApplication::desktop()->screenNumber(widget);
QScreen* screen = QApplication::screens().at(screenNumber);
然后截图就跟上面一样。
3.高屏幕截图
上面的方法只是对普通屏幕的截图,一般的屏幕缩放因子为1,所以没有问题,但对于mac屏幕来说,你会发现截图存在问题。
1.首先我们获取缩放因子
可以通过QApplication::desktop()获取,也可以通过QWidget来获取,这里我通过widget来获取
double devicePixelRatiovalue = widget->devicePixelRatio();
2.截图
QPixmap pixmap = screen->grabWindow(QApplication::desktop()->winId(),
offsetX,
offsetY,
screenwidth/devicePixelRatiovalue,
screenheigh/devicePixelRatiovalue);
注意:qt在mac扩展屏下截图存在问题