在QT开发中,难免会遇到想要改变鼠标的样式。QT中本身提供十几种常见的鼠标样式:
举例说明如何更改: 假设显示一个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的同目录下。
下面说一下开发的过程中遇到的问题: 想要鼠标只要在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ㄒ)/~~