qt QTextEdit选中内容拖拽时的鼠标样式无法设置问题

背景:项目中要实现对QTextEdit里面选中的文字选中后进行拖拽处理, 但是无论设置哪个对象的鼠标样式,都无法生效,都会报一下这个

 

后面查看这个19的对应的鼠标样式,是DragCopyCursor这个枚举值,原因可能是QTextEdit在选中文字之后拖动时认为是复制的动作; 实际上在拖动选中的文字时,QTextEdit内部qt_scrollarea_viewport生成了一个QDrag对象,而且这个动作是Qt::CopyAction,因此想要改变拖拽的鼠标样式,需要取它里面的子对象中类型是QDrag出来,并且对其检查进行setDragCursor操作即可; 部分代码如下:

            // 由于QTextEdit 在拖拽时内部会生成QDrag对象,并且鼠标样式是内部的QDrag对象自己设置,因此想要设置自定义鼠标样式,需要找到源对象中的QDrag对象,并且进行修改复制的鼠标样式(因为是复制操作,所以修改的是CopyAction
            // 其他可根据动作类型选择后面的参数 (其他拖拽时可以选择外部生成QDrag对象,并且设置拖拽鼠标样式)
            QDrag *pDrag = (event->source())->findChild<QDrag *>();
            if ( pDrag )
                pDrag->setDragCursor(QPixmap(":/Image/Common/icon_openhand.png"), Qt::CopyAction);

其中,  event为QDropEvent类型,通过它可以找到拖动的来源对象是哪个;  一般这个设置在进入DragEnterEvent里面处理; 

另外注意的是, 避免QTextEdit重复触发外面主窗体的DragEnterEvent事件,需要设置禁止本身拖拽属性

 

m_pTextEdit->setAcceptDrops(false);             // 禁止本身接受拖拽
m_pTextEdit为以上操作的目标;

 

posted @   蔡头一枚  阅读(145)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示