免费网站流量统计工具,做外贸的社交网站,鹤山市网站建设公司,wordpress企业站主题在win平台下#xff0c;实现截取选桌面执行推理功能#xff0c;用一个qwidget(j对象名为m_selectWidget)来显示选取范围的边框#xff0c;但这个qwidget显示后#xff0c;其他窗口在他下面可以接受鼠标相应的事件#xff0c;但原来的鼠标形状功能失效#xff08;mac正常实现截取选桌面执行推理功能用一个qwidget(j对象名为m_selectWidget)来显示选取范围的边框但这个qwidget显示后其他窗口在他下面可以接受鼠标相应的事件但原来的鼠标形状功能失效mac正常分析原因是上层是m_selectWidget,而m_selectWidget的形状为Qt::ArrowCursor,通过分析在win平台下已当前鼠标所在的widget为最后一个鼠标形状所以下层的鼠标形状修改后马上又被m_selectWidget的Qt::ArrowCursor覆盖导致鼠标形状一直为Qt::ArrowCursor。 通过源码的分析发现一个解决方案一
1、重载QApplication的notify接口当QEvent的类型为QEvent::CursorChange的时候发送一个信号例如sigCursorChange
2、m_selectWidget绑定这个信号在槽函数获取当前鼠标所在的qwidget然后吧m_selectWidget自身的形状设置为此qwidget的形状即可 方案二通过win系统api修改m_selectWidget的属性忽略所有的鼠标事件。
关键代码SetWindowLongPtr((HWND)m_selectWidget-winId(), GWL_EXSTYLE, GetWindowLong((HWND)m_selectWidget-winId(), GWL_EXSTYLE) | WS_EX_TRANSPARENT | WS_EX_LAYERED); 相关地址
SetWindowLongPtrA function (winuser.h) - Win32 apps | Microsoft Learn
Window Features - Win32 apps | Microsoft Learn 方案三
最简单的方案通过设置属性
m_selectWidget-setWindowFlags(Qt.WindowTransparentForInput)
注意方案二和方案三子类也无法获取输入操作