QT自定义鼠标样式

在QT开发中,难免会遇到想要改变鼠标的样式。QT中本身提供十几种常见的鼠标样式:

QT自定义鼠标样式_第1张图片
举例说明如何更改:
假设显示一个label,想要鼠标落在label上的时候,鼠标变成手形,代码如下:

ui->label->setCursor(Qt::OpenHandCursor);

有时候,这几种样式并不能满足开发的需要。比如开发画图工具时,想要使用橡皮擦的时候,希望鼠标为圆形或正方形。那么就要自己定义鼠标的样式了。我用的办法比较简单,就是改变成图片。

QCursor cursor;
//加载图片
QPixmap pixmap("erase.png");
//定义大小
QSize picSize(8, 8);
//缩放图片,按比例
QPixmap scaledPixmap = pixmap.scaled(picSize, Qt::KeepAspectRatio);
//设置样式
cursor = QCursor(scaledPixmap, -1, -1);
//更改鼠标形状
ui->label->setCursor(cursor);

加载图片的时候,使用了绝对路径,那么要将图片放在exe的同目录下。


自动触发mouseMoveEvent

下面说一下开发的过程中遇到的问题:
想要鼠标只要在label上面移动,就出发mouseMoveEvent(),但是没有成功。

在Qt中要捕捉鼠标移动事件需要重写MouseMoveEvent,但是MouseMoveEvent为了不太耗资源在默认状态下是要鼠标按下才能捕捉到。要想鼠标不按下时的移动也能捕捉到,需要

ui->label->setMouseTracking(true);

setMouseTracking(bool mouseTracking)

  • 如果鼠标跟踪失效(默认),当鼠标被移动的时候只有在至少一个鼠标按键被按下时,这个窗口部件才会接收鼠标移动事件。

  • 如果鼠标跟踪生效,如果没有按键被按下,这个窗口部件也会接收鼠标移动事件。

QWidget中这样使用是没有问题的,但是,对于QMainWindow即使使用了setMouseTracking(true)依然无法捕捉到鼠标没有按下的移动,只有在鼠标按下是才能捕捉。

解决办法:
先把QMainWindow的CentrolWIdget使用setMouseTracking(true)开启移动监视。然后在把QMainWindow的setMouseTracking(true)开启监视。
原因:
CentrolWIdget是QMainWindow的子类,你如果在子类上响应鼠标事件,只会触发子类的mouseMoveEvent,根据c++继承和重载的原理,所以子类也要setMouseTracking(true); 所以如果你想响应鼠标事件的控件被某个父控件包含,则该控件及其父控件或容器也需要setMouseTracking(true);

但是我使用:

ui->centralWidget->setMouseTracking(true);
this->setMouseTracking(true);

没有解决问题。最终没有找到如何解决/(ㄒoㄒ)/~~

参考:
  • 1 http://blog.csdn.net/yiyaaixuexi/article/details/7165943
  • 2 http://ju.outofmemory.cn/entry/162210
  • 3 http://blog.csdn.net/lt4959/article/details/12496677

你可能感兴趣的:(QT,qt,鼠标样式)