• 9618阅读
  • 6回复

要实现在整个屏幕中获取鼠标所在的位置和颜色值,该用怎样的解决思路? [复制链接]

上一主题 下一主题
离线纵刀少年
 

只看楼主 倒序阅读 楼主  发表于: 2013-04-04
大概就是像这个软件这个,尝试过从QWidget::mouseMoveEvent入手,但好像只能在窗体内移动才会触发。

尝试一下的思路,但不太行。
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{

   int x=event->globalX();
   int y=event->globalY();
   ui->locationLabel->setText(QString::number(x)+','+QString::number(y));

   this->screenPixmap= QPixmap::grabWindow(QApplication::desktop()->winId(),x,y,1,1); //这能获得鼠标当前位置的像素值吗?
   ui->label_2->setPixmap(this->screenPixmap);
   QColor color=QColor(screenPixmap.toImage().pixel(QPoint(x,y)));
   ui->rgbLabel->setText('('+QString::number(color.red())+','+QString::number(color.green())+','+QString::number(color.blue())+')');
}


反应比较迟钝。
当 this->screenPixmap= QPixmap::grabWindow(QApplication::desktop()->winId(),x,y,1,1);
会警告超出范围:QImage::pixel: coordinate (1145,150) out of range。
而  this->screenPixmap= QPixmap::grabWindow(QApplication::desktop()->winId(),x,y,-1,-1);//默认宽度和高度
则不会提示,为什么会这样?
离线roywillow

只看该作者 1楼 发表于: 2013-04-05
我之前实现过类似的功能,好像贴在某个区里了
确实使用鼠标事件只能实现在窗口范围内实现捕捉,这个qt应该是无法改变的
我当时使用了QTimer,配合QCursor的某个静态函数,定期获得鼠标在整个屏幕的位置
然后截图,并且也是只截取鼠标位置下的一个像素
你的那个超出范围的原因应该是pixel()访问的问题,因为你截取的图片只是鼠标下的一个像素,所以这个像素在图片中的坐标是(0,0),不是(x,y)
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线纵刀少年

只看该作者 2楼 发表于: 2013-04-05
回 1楼(roywillow) 的帖子
哦哦!明白!

THANKS
离线xsjqqq123

只看该作者 3楼 发表于: 2013-04-05
楼主,做好后能否借来研究下?
离线纵刀少年

只看该作者 4楼 发表于: 2013-04-05
回 3楼(xsjqqq123) 的帖子
只是研究一下方法,不是一个任务。不一定会做出来个像样的项目来~
另,上面截图的软件是按键精灵中的一个小程序。
离线zs_test

只看该作者 5楼 发表于: 2016-03-11

离线zs_test

只看该作者 6楼 发表于: 2016-03-11
看了楼主的思想,我现在已经实现功能了,不错,顶个
快速回复
限100 字节
 
上一个 下一个