• 6822阅读
  • 6回复

关于Qt截屏程序 请教 [复制链接]

上一主题 下一主题
离线yuzhouzhiwai
 

只看楼主 倒序阅读 楼主  发表于: 2011-09-11
大家都知道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的截屏效果
离线jdwx

只看该作者 1楼 发表于: 2011-09-11
回 楼主(yuzhouzhiwai) 的帖子
用一个QWidget和屏幕一样大,截屏图片画到上面(假桌面),再画四条半透明边框,留出中间透明的部分,由于有图片,就点不到下面去了。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线yuzhouzhiwai

只看该作者 2楼 发表于: 2011-09-13
回 1楼(jdwx) 的帖子
“再画四条半透明边框” 的意思是 选择之外的区域分成四个矩形去画?  
离线jdwx

只看该作者 3楼 发表于: 2011-09-13
回 2楼(yuzhouzhiwai) 的帖子
就是这个意思
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线yuzhouzhiwai

只看该作者 4楼 发表于: 2011-09-14
回 3楼(jdwx) 的帖子
QT中透明是不是就是没有啊   设置某个区域透明的话 那个区域是不可点击的
离线jdwx

只看该作者 5楼 发表于: 2011-09-14
回 4楼(yuzhouzhiwai) 的帖子
透明区域是点不到。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线yuzhouzhiwai

只看该作者 6楼 发表于: 2011-09-15
回 4楼(yuzhouzhiwai) 的帖子
多谢啦 已经弄好了
快速回复
限100 字节
 
上一个 下一个