注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

沙漠里de烟雨

原创分享,禁止转载

 
 
 

日志

 
 

Qt---鼠标移动,setMouseTracking(true) 与拖动, 不响应时如何处理  

2014-06-28 03:33:44|  分类: QT5.x与QML |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
拖动时,一般mousePressEvent 与mouseMoveEvent来处理拖动问题,然当设置了setMouseTracking(true)时,就无法拖动了,如欲想此窗口在鼠标移动时能够高亮显示表格中的单元格或是在paintEvent中画类似CAD作图时的十字线,且十字线跟随鼠标移动(必须setMouseTracking(true)),而且同时想在此窗口中拖动客户区,实现窗口的移动等变化,若要使两者兼具,同时操作同一(子)窗口(如 A 窗口),方法是,新建一个B窗口,作为A窗口的父窗口,然后分别在这两个窗口中实现mousePressEvent 与mouseMoveEvent事件,在A窗口中,添加setMouseTracking(true),在B窗口中则不要加入此语句,此时在其mousePressEvent中对A窗口(子窗口)进行move移动处理。

补充:

一般的,要设置鼠标移动到控件上而不点击时也能触发mouseMoveEvent函数,只要在其构造函数中setMouseTracking(true)即可,当我们的这个控件经过父子关系的层层堆叠,只要最上面的控件(最child控件)如此设置都能如愿,有时加上了这句代码仍不会触发mouseMoveEvent函数,建议从最里面的窗口(最parent的窗口)设置setMouseTracking(true)+mouseMoveEvent来调试,直到出现不能触发的那层控件,按上方法很容易找出问题出在何处。

通常造成这个原因是子控件覆盖了父控件的位置,当鼠标移到子控件上时,由于子控件没有设置setMouseTracking(true),这样就会造成上层控件把鼠标移动时的信号拦截了,到不了下一层控件(父控件),如果不想重写最上层的子控件,而想对下层控件作处理的话,需要对子控件设置鼠标移动消息的穿透,如下示意代码:
class Wdt : public QWidget;

class  panel : public Wdt
{
QLabel*  lab1 = new QLabel("aaa",this);
QLabel* lab2 = new QLabel("bbb",this);

// 将lab1,lab2并排铺满此窗口;
.....

this->setMouseTracking(true);
}
void  panel::mouseMoveEvent(QMouseEvent* event)
{
qDebug() << "panel  moving..." << endl;
Wdt::mouseMoveEvent(event); // ---- (**注意**)
}

Wdt* p = new panel(xxx); 

此时,因为lab1,lab2铺满了整个窗口,所以当鼠标移到lab1或lab2时,消息被lab1或lab2阻挡,因为lab1与lab2没有设置
setMouseTracking(true); 故在this->setMouseTracking(true)这句代码前加上:
lab1->setMouseTracking(true);
lab2->setMouseTracking(true);
即可。
当然,如果没有这两句代码,且lab1与lab2并未铺满整个窗口,未覆盖的部分也是可以响应的。

还有要注意的一点是,
如上mouseMoveEvent函数中 '---(**注意**)' 所标注的最后那句代码,如果没有,则不会调用Wdt中的mouseMoveEvent函数(如果有的话),因为继承关系,先子类函数再基类函数,逐级响应。

这个问题曾困扰了我很久,网上也大都只提一下setmousetracking(true)就算了事,并没有对其进一步分析说明,而上面的情况经常遇到,这里就分享出来以作前车之鉴。
  评论这张
 
阅读(531)| 评论(0)
推荐

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017