大家都知道qq截屏吧,用起来很方便,所截屏幕很直观,就是截屏的时候,首先整个屏幕做一层遮罩,然后鼠标选择截屏区域的时候,被选中区域是透明的,与剩下的区域有个对比,这样的效果会很好。
本人想用Qt完成一个类似功能的截屏软件,但是。。。
首先是一种简单的思路,就是截屏开始,程序中先记录下来当前屏幕的图片,可以保存在Qpixmap中,然后整个屏幕做一层遮罩(一层雾,半透明效果),用户选择的时候,选择框内是透明的,选中之后的操作就是保存图片或者放到剪贴板中了,截屏完毕。这种思路有一个需要改进的地方,就是截屏程序启动之后,用户切换到别的程序界面,然后又切回截屏程序的时候,这个时候你需要将Qpixmap中保存的内容更换一下,或者你像QQ截屏一样不允许更换截屏之后的屏幕界面。或者你干脆将截屏时的画面放到一个label上或者作为widget的背景,这样也可以。
然后就是实现,实现截屏选择并保存很简单,这里不说了。关键一点我觉得是画选框的时候如何做到选择区域是透明的。我尝试了以下方法,并未成功,想像路过的大侠寻求解决方案。
利用Qwidget::setMask,我从Qwidget继承了一个类,声明一个Qbitmap变量,并做如下操作:
QRect r = QApplication::desktop()->screenGeometry();
QBitmap bmp (r.width(), r.height() );
bmp.fill(Qt::color1);
然后在paintEvent事件中做如下操作:
QPainter painter(&bmp);
//painter.fillRect(r, Qt::color0);
QPen pen(Qt::red);
painter.setPen(pen);
painter.drawRect(QRect(beginPoint, endPoint) );
painter.fillRect(QRect(beginPoint, endPoint), Qt::color0);
//painter.fillRect(QRect(100, 100, 500,500), Qt::color0);
setMask(bmp);
其中beginPoint和endPoint是选择框的起始点和终点,
这样可以做到类似于win7的自带截屏工具的效果,但是无法做到(我没做到)QQ截屏的效果,因为选择区域虽然是透明的,但也是可以点击遮罩后面的,无法拖动所选区域了。
所以想在这里请教各位如何实现类似QQ的截屏效果