QT自定义鼠标样式 | 您所在的位置:网站首页 › 如何自定义鼠标样式设置 › QT自定义鼠标样式 |
在QT开发中,难免会遇到想要改变鼠标的样式。QT中本身提供十几种常见的鼠标样式:
有时候,这几种样式并不能满足开发的需要。比如开发画图工具时,想要使用橡皮擦的时候,希望鼠标为圆形或正方形。那么就要自己定义鼠标的样式了。我用的办法比较简单,就是改变成图片。 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/71659432 http://ju.outofmemory.cn/entry/1622103 http://blog.csdn.net/lt4959/article/details/12496677 |
今日新闻 |
推荐新闻 |
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 |