QT自定义鼠标样式 您所在的位置:网站首页 如何自定义鼠标样式设置 QT自定义鼠标样式

QT自定义鼠标样式

2024-07-18 07:10| 来源: 网络整理| 查看: 265

在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的同目录下。

自动触发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 实验室设备网 版权所有