.. | ||
ScreenShot | ||
无边框自定义标题栏窗口 | ||
README.md | ||
分割窗口的分割条重写.py | ||
外部窗口跟随.py | ||
嵌入外部窗口.py | ||
消息对话框倒计时关闭.py | ||
窗口重启.py | ||
简单探测窗口和放大截图.py | ||
简单的窗口贴边隐藏.py |
窗口案例
1、重启窗口Widget
利用类变量对窗口的变量进行引用,防止被回收(导致窗口一闪而过),重启时先显示新窗口后关闭自己
2、分割窗口的分割条重绘
- 原理在于
QSplitter
在创建分割条的时候会调用createHandle
函数 - 通过重新写
createHandle
返回自己的QSplitterHandle
类 - 通过
QSplitterHandle
的paintEvent
实现绘制其它形状, - 重写
mousePressEvent
和mouseMoveEvent
来实现鼠标的其它事件
3、简单的窗口贴边隐藏
-
大概思路
- 思路是当窗口进入左边,顶部,右边一半时,此时判断窗口的坐标
- 如果窗口的x坐标小于0 则需要隐藏到左边
- 如果窗口的y坐标小于0 则需要隐藏到顶部
- 如果窗口的x坐标大于屏幕宽度-窗口宽度/2 则需要隐藏到右边
-
事件说明
mousePressEvent
,鼠标按下事件,主要记录按下的坐标mouseMoveEvent
,鼠标移动事件,用于移动窗口mouseReleaseEvent
,鼠标弹起事件,用于判断是否需要隐藏窗口enterEvent
,鼠标进入事件,用于窗口隐藏后,是否需要暂时显示预览leaveEvent
,鼠标离开事件,用于窗口暂时显示后自动隐藏效果
4、嵌入外部窗口
- 使用
SetParent
函数设置外部窗口的parent
为Qt的窗口 - Qt使用
QWidget.createWindowContainer(QWindow.fromWinId(窗口ID))
生成QWidget - 使用
GetWindowLong
得到原来窗口的样式属性style = win32gui.GetWindowLong(hwnd, win32con.GWL_STYLE)
和exstyle = win32gui.GetWindowLong(hwnd, win32con.GWL_EXSTYLE)
- 这里还原窗口后不会显示,用spy++发现没有了WS_VISIBLE样式(未解决)
5、简单跟随其它窗口
- 利用win32gui模块获取目标窗口的句柄
- 通过句柄获取目标窗口的大小位置,并设置自己的位置
- 当句柄失效时关闭自己
- 主要是检测时间,在10毫秒以下很流畅
6、简单探测窗口和放大截图
- 利用
win32gui
模块获取鼠标所在位置的窗口大小(未去掉边框)和rgb颜色 - 利用一个全屏的全透明鼠标穿透的窗口(目的在于绘制矩形框和截图)
7、消息对话框倒计时关闭
- 通过继承
QMessageBox
实现倒计时关闭的对话框 QTimer
定时器关闭窗口
8、无边框自定义标题栏窗口
-
方式一(QWidget)
- 使用一个
QWidget
(FramelessWindow
)作为父窗口, 一个TitleBar
作为标题栏, 一个QWidget
作为底部容器 - 父窗口
FramelessWindow
设置为背景透明,但是需要绘制一定宽度的透明度很高的矩形边框用来接受鼠标事件(变形鼠标样式进行调整窗口大小) TitleBar
的最小化最大化关闭等按钮事件关联到父窗口里TitleBar
中的鼠标按下移动事件得到坐标也传递到父窗口调用move方法进行窗口移动
- 使用一个
-
方式二(windows api)
- 使用
win32gui
设置薄边框 - 重写
nativeEvent
事件拦截边框的系统边框的显示,并返回各个方向
- 使用