From d26a2465c479c6424b5a3de6b09802998a4cc60a Mon Sep 17 00:00:00 2001 From: Irony <892768447@qq.com> Date: Tue, 30 Oct 2018 23:59:00 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=AE=8C=E5=96=84Readme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .settings/org.eclipse.core.resources.prefs | 4 +- ActiveX/README.md | 6 +- 动画/README.md | 54 ++++++++++++++++-- 动画/ScreenShot/{2.gif => 右键菜单动画.gif} | Bin 动画/ScreenShot/按钮放大缩小动画.gif | Bin 0 -> 39016 bytes 动画/ScreenShot/{1.gif => 窗口淡入淡出.gif} | Bin 动画/按钮放大缩小动画.py | 8 +-- 动画/{淡入淡出.py => 窗口淡入淡出.py} | 1 + 多线程/README.md | 19 ++++++ .../ScreenShot/1.gif => ScreenShot/线程挂起恢复.gif} | Bin 多线程/{线程挂起恢复 => }/moveToThread.py | 0 多线程/{线程挂起恢复 => }/线程挂起恢复.py | 0 多线程/线程挂起恢复/README.md | 16 ------ .../inheritQThread.py => 继承QThread.py} | 0 窗口/README.md | 42 +++++++------- 菜单/README.md | 8 +-- 表格/QTableView/README.md | 2 +- 表格/QTableWidget/README.md | 2 +- 18 files changed, 105 insertions(+), 57 deletions(-) rename 动画/ScreenShot/{2.gif => 右键菜单动画.gif} (100%) create mode 100644 动画/ScreenShot/按钮放大缩小动画.gif rename 动画/ScreenShot/{1.gif => 窗口淡入淡出.gif} (100%) rename 动画/{淡入淡出.py => 窗口淡入淡出.py} (96%) create mode 100644 多线程/README.md rename 多线程/{线程挂起恢复/ScreenShot/1.gif => ScreenShot/线程挂起恢复.gif} (100%) rename 多线程/{线程挂起恢复 => }/moveToThread.py (100%) rename 多线程/{线程挂起恢复 => }/线程挂起恢复.py (100%) delete mode 100644 多线程/线程挂起恢复/README.md rename 多线程/{线程挂起恢复/inheritQThread.py => 继承QThread.py} (100%) diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs index 84006ca..ea723b6 100644 --- a/.settings/org.eclipse.core.resources.prefs +++ b/.settings/org.eclipse.core.resources.prefs @@ -30,7 +30,7 @@ encoding//\u5217\u8868/QListWidget/\u817E\u8BAF\u89C6\u9891\u70ED\u64AD\u5217\u8 encoding//\u5217\u8868/QListWidget/\u81EA\u5B9A\u4E49\u53EF\u62D6\u62FDItem.py=utf-8 encoding//\u52A8\u753B/\u53F3\u952E\u83DC\u5355\u52A8\u753B.py=utf-8 encoding//\u52A8\u753B/\u6309\u94AE\u653E\u5927\u7F29\u5C0F\u52A8\u753B.py=utf-8 -encoding//\u52A8\u753B/\u6DE1\u5165\u6DE1\u51FA.py=utf-8 +encoding//\u52A8\u753B/\u7A97\u53E3\u6DE1\u5165\u6DE1\u51FA.py=utf-8 encoding//\u56FE\u5F62\u89C6\u56FE/ImageView.py=utf-8 encoding//\u56FE\u5F62\u89C6\u56FE/QGraphicsItem/Item\u62D6\u62FD\u6539\u53D8\u5927\u5C0F.py=utf-8 encoding//\u56FE\u5F62\u89C6\u56FE/QGraphicsItem/Item\u79FB\u52A8.py=utf-8 @@ -58,6 +58,8 @@ encoding//\u56FE\u8868/PyQtChart\u7EC3\u4E60/test/LineChart.py=utf-8 encoding//\u56FE\u8868/PyQtChart\u7EC3\u4E60/test/LineChart\u81EA\u5B9A\u4E49xy\u8F74.py=utf-8 encoding//\u56FE\u8868/PyQtChart\u7EC3\u4E60/test/ToolTip.py=utf-8 encoding//\u56FE\u8868/PyQtChart\u7EC3\u4E60/test/ToolTip2.py=utf-8 +encoding//\u591A\u7EBF\u7A0B/moveToThread.py=utf-8 +encoding//\u591A\u7EBF\u7A0B/\u7EE7\u627FQThread.py=utf-8 encoding//\u591A\u9875\u9762/QScrollArea/\u4EFFQQ\u8BBE\u7F6E\u9762\u677F/SettingUi.py=utf-8 encoding//\u591A\u9875\u9762/QScrollArea/\u4EFFQQ\u8BBE\u7F6E\u9762\u677F/Window.py=utf-8 encoding//\u591A\u9875\u9762/QStackedWidget/\u5DE6\u4FA7\u9009\u9879\u5361/LeftTabWidget.py=utf-8 diff --git a/ActiveX/README.md b/ActiveX/README.md index 5973494..4789e33 100644 --- a/ActiveX/README.md +++ b/ActiveX/README.md @@ -2,8 +2,8 @@ ## [1、显示Word、Excel、PDF文件](显示word_excel_pdf.py) -1. 利用 Word.Application 打开Word文件 -1. 利用 Excel.Application 打开Excel文件 -1. 利用 Adobe PDF Reader 打开PDF文件(前提先装PDF软件) +1. 利用 `Word.Application` 打开Word文件 +1. 利用 `Excel.Application` 打开Excel文件 +1. 利用 `Adobe PDF Reader` 打开PDF文件(前提先装PDF软件) ![截图](ScreenShot/显示word_excel_pdf.png) \ No newline at end of file diff --git a/动画/README.md b/动画/README.md index 547457c..95a14b2 100644 --- a/动画/README.md +++ b/动画/README.md @@ -1,10 +1,52 @@ -# 简单的动画特效 +# 动画特效 使用QPropertyAnimation属性类动画(支持的属性有限) -### 常见例子 - - [1.1 淡入淡出](淡入淡出.py)
- ![截图](ScreenShot/1.gif) +## [1、窗口淡入淡出](窗口淡入淡出.py) + +1. 使用`QPropertyAnimation`对窗口的`windowOpacity`透明度属性进行修改 +1. 窗口启动时开启透明度0-->1的动画 + 1. 尝试先取消动画完成后关闭窗口的信号(使用同一个动画对象,在关闭窗口动画的时候连接了动画结束后关闭窗口的信号) + 1. 停止旧动画开启新动画 +1. 窗口关闭时开启透明度1-->0的动画 + 1. 停止就动画 + 1. 绑定动画完成后`finished`信号连接到`close`关闭窗口函数 + +![截图](ScreenShot/窗口淡入淡出.gif) - - [1.2 右键菜单动画](右键菜单动画.py)
- ![截图](ScreenShot/2.gif) \ No newline at end of file +## [2、右键菜单动画](右键菜单动画.py) + +1. 使用`QPropertyAnimation`对菜单控件的`geometry`属性进行修改 +1. 当菜单事件`contextMenuEvent`触发时调用动画启动,同时显示菜单 + +![截图](ScreenShot/右键菜单动画.gif) + +## [3、按钮放大缩小动画](按钮放大缩小动画.py) + +1. 使用`QPropertyAnimation`对按钮的`geometry`属性进行修改 +1. 针对按钮在布局中或者没有在布局中两种情况,需要对主窗口的`showEvent`和`resizeEvent`两个事件进行重写,从而达到更新按钮的最新`geometry`值 +1. 主动调用按钮的`updatePos`函数来更新`geometry`值 + +比如: + +```python +def showEvent(self, event): + super(TestWindow, self).showEvent(event) + # 更新按钮的位置 + self.button1.updatePos() + # 针对不在控件中的按钮 + self.button2.move(self.width() - self.button2.width() - 15, + self.height() - self.button2.height() - 10) + self.button2.updatePos() + +def resizeEvent(self, event): + super(TestWindow, self).resizeEvent(event) + # 更新按钮的位置 + self.button1.updatePos() + # 针对不在控件中的按钮 + self.button2.move(self.width() - self.button2.width() - 15, + self.height() - self.button2.height() - 10) + self.button2.updatePos() +``` + +![截图](ScreenShot/按钮放大缩小动画.gif) \ No newline at end of file diff --git a/动画/ScreenShot/2.gif b/动画/ScreenShot/右键菜单动画.gif similarity index 100% rename from 动画/ScreenShot/2.gif rename to 动画/ScreenShot/右键菜单动画.gif diff --git a/动画/ScreenShot/按钮放大缩小动画.gif b/动画/ScreenShot/按钮放大缩小动画.gif new file mode 100644 index 0000000000000000000000000000000000000000..d6cfc2fa53b857217896ebda1cc7bedfed0123f1 GIT binary patch literal 39016 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

QxP*50dSl%e?=3>mwKy*f4rN>Vq(vp95EZ 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

96KVxKf2w1fPM9~h~S&yQ? I#s=N}Uk>$o0ssI2 literal 0 HcmV?d00001 diff --git a/动画/ScreenShot/1.gif b/动画/ScreenShot/窗口淡入淡出.gif similarity index 100% rename from 动画/ScreenShot/1.gif rename to 动画/ScreenShot/窗口淡入淡出.gif diff --git a/动画/按钮放大缩小动画.py b/动画/按钮放大缩小动画.py index a43475d..c52f139 100644 --- a/动画/按钮放大缩小动画.py +++ b/动画/按钮放大缩小动画.py @@ -92,18 +92,18 @@ class TestWindow(QWidget): super(TestWindow, self).showEvent(event) # 更新按钮的位置 self.button1.updatePos() - + # 针对不在控件中的按钮 self.button2.move(self.width() - self.button2.width() - 15, - self.height() - self.button2.height() - 10) + self.height() - self.button2.height() - 10) self.button2.updatePos() def resizeEvent(self, event): super(TestWindow, self).resizeEvent(event) # 更新按钮的位置 self.button1.updatePos() - + # 针对不在控件中的按钮 self.button2.move(self.width() - self.button2.width() - 15, - self.height() - self.button2.height() - 10) + self.height() - self.button2.height() - 10) self.button2.updatePos() diff --git a/动画/淡入淡出.py b/动画/窗口淡入淡出.py similarity index 96% rename from 动画/淡入淡出.py rename to 动画/窗口淡入淡出.py index 4517edf..2669789 100644 --- a/动画/淡入淡出.py +++ b/动画/窗口淡入淡出.py @@ -34,6 +34,7 @@ class Window(QWidget): def doShow(self): try: + # 尝试先取消动画完成后关闭窗口的信号 self.animation.finished.disconnect(self.close) except: pass diff --git a/多线程/README.md b/多线程/README.md new file mode 100644 index 0000000..61d870d --- /dev/null +++ b/多线程/README.md @@ -0,0 +1,19 @@ +# 多线程 + +PyQt多线程的简单使用例子 + +## [1、继承QThread](继承QThread.py) + +## [2、moveToThread](moveToThread.py) + +## [3、线程挂起恢复](线程挂起恢复.py) + +注意,这里只是简单演示,在应用这些代码时要小心 + +1. 这里使用windows的api实现,主要用到`SuspendThread`和`ResumeThread`函数 +1. 利用`ctypes.windll.kernel32.OpenThread(win32con.PROCESS_ALL_ACCESS, False, int(QThread.currentThreadId()))` +1. 得到线程的句柄,然后就可以通过上面的两个函数对其进行挂起与恢复 + +`ctypes.windll.kernel32.TerminateThread`终止线程,不推荐 + +![截图](ScreenShot/线程挂起恢复.gif) \ No newline at end of file diff --git a/多线程/线程挂起恢复/ScreenShot/1.gif b/多线程/ScreenShot/线程挂起恢复.gif similarity index 100% rename from 多线程/线程挂起恢复/ScreenShot/1.gif rename to 多线程/ScreenShot/线程挂起恢复.gif diff --git a/多线程/线程挂起恢复/moveToThread.py b/多线程/moveToThread.py similarity index 100% rename from 多线程/线程挂起恢复/moveToThread.py rename to 多线程/moveToThread.py diff --git a/多线程/线程挂起恢复/线程挂起恢复.py b/多线程/线程挂起恢复.py similarity index 100% rename from 多线程/线程挂起恢复/线程挂起恢复.py rename to 多线程/线程挂起恢复.py diff --git a/多线程/线程挂起恢复/README.md b/多线程/线程挂起恢复/README.md deleted file mode 100644 index 0405c28..0000000 --- a/多线程/线程挂起恢复/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# 简单的子线程例子 - -使用继承QThread和moveToThread两种方式 - -# 注意,这里只是简单演示,在应用这些代码时要小心 -## 线程的挂起与恢复 -这里使用windows的api实现,主要用到SuspendThread和ResumeThread函数 - -利用ctypes.windll.kernel32.OpenThread(win32con.PROCESS_ALL_ACCESS, False, int(QThread.currentThreadId())) - -得到线程的句柄,然后就可以通过上面的两个函数对其进行挂起与恢复 - -ctypes.windll.kernel32.TerminateThread终止线程,不推荐 - -## 截图 -![截图](ScreenShot/1.gif) \ No newline at end of file diff --git a/多线程/线程挂起恢复/inheritQThread.py b/多线程/继承QThread.py similarity index 100% rename from 多线程/线程挂起恢复/inheritQThread.py rename to 多线程/继承QThread.py diff --git a/窗口/README.md b/窗口/README.md index e62c8a4..3daf420 100644 --- a/窗口/README.md +++ b/窗口/README.md @@ -8,10 +8,10 @@ ## [2、分割窗口的分割条重绘](分割窗口的分割条重写.py) -1. 原理在于QSplitter在创建分割条的时候会调用createHandle函数 -1. 通过重新写createHandle返回自己的QSplitterHandle类 -1. 通过QSplitterHandle的paintEvent实现绘制其它形状, -1. 重写mousePressEvent和mouseMoveEvent来实现鼠标的其它事件 +1. 原理在于`QSplitter`在创建分割条的时候会调用`createHandle`函数 +1. 通过重新写`createHandle`返回自己的`QSplitterHandle`类 +1. 通过`QSplitterHandle`的`paintEvent`实现绘制其它形状, +1. 重写`mousePressEvent`和`mouseMoveEvent`来实现鼠标的其它事件 ![截图](ScreenShot/分割窗口的分割条重写.gif) @@ -24,17 +24,17 @@ 1. 如果窗口的x坐标大于屏幕宽度-窗口宽度/2 则需要隐藏到右边 2. 事件说明 - 1. mousePressEvent,鼠标按下事件,主要记录按下的坐标 - 1. mouseMoveEvent,鼠标移动事件,用于移动窗口 - 1. mouseReleaseEvent,鼠标弹起事件,用于判断是否需要隐藏窗口 - 1. enterEvent,鼠标进入事件,用于窗口隐藏后,是否需要暂时显示预览 - 1. leaveEvent,鼠标离开事件,用于窗口暂时显示后自动隐藏效果 + 1. `mousePressEvent`,鼠标按下事件,主要记录按下的坐标 + 1. `mouseMoveEvent`,鼠标移动事件,用于移动窗口 + 1. `mouseReleaseEvent`,鼠标弹起事件,用于判断是否需要隐藏窗口 + 1. `enterEvent`,鼠标进入事件,用于窗口隐藏后,是否需要暂时显示预览 + 1. `leaveEvent`,鼠标离开事件,用于窗口暂时显示后自动隐藏效果 ## [4、嵌入外部窗口](嵌入外部窗口.py) -1. 使用SetParent函数设置外部窗口的parent为Qt的窗口 -1. Qt使用QWidget.createWindowContainer(QWindow.fromWinId(窗口ID))生成QWidget -1. 使用GetWindowLong得到原来窗口的样式属性(style = win32gui.GetWindowLong(hwnd, win32con.GWL_STYLE)和exstyle = win32gui.GetWindowLong(hwnd, win32con.GWL_EXSTYLE)) +1. 使用`SetParent`函数设置外部窗口的`parent`为Qt的窗口 +1. Qt使用`QWidget.createWindowContainer(QWindow.fromWinId(窗口ID))`生成QWidget +1. 使用`GetWindowLong`得到原来窗口的样式属性`style = win32gui.GetWindowLong(hwnd, win32con.GWL_STYLE)`和`exstyle = win32gui.GetWindowLong(hwnd, win32con.GWL_EXSTYLE)` 1. 这里还原窗口后不会显示,用spy++发现没有了WS_VISIBLE样式(未解决) ![截图](ScreenShot/嵌入外部窗口.gif) @@ -52,7 +52,7 @@ ## [6、简单探测窗口和放大截图](简单探测窗口和放大截图.py) -1. 利用win32gui模块获取鼠标所在位置的窗口大小(未去掉边框)和rgb颜色 +1. 利用`win32gui`模块获取鼠标所在位置的窗口大小(未去掉边框)和rgb颜色 1. 利用一个全屏的全透明鼠标穿透的窗口(目的在于绘制矩形框和截图) ![截图](ScreenShot/简单探测窗口和放大截图.gif) @@ -60,8 +60,8 @@ ## [7、消息对话框倒计时关闭](消息对话框倒计时关闭.py) -1. 通过继承QMessageBox实现倒计时关闭的对话框 -1. QTimer定时器关闭窗口 +1. 通过继承`QMessageBox`实现倒计时关闭的对话框 +1. `QTimer`定时器关闭窗口 ![截图](ScreenShot/消息对话框倒计时关闭.gif) @@ -69,17 +69,17 @@ 1. 方式一(QWidget) - 1. 使用一个QWidget(FramelessWindow)作为父窗口, 一个TitleBar作为标题栏, 一个QWidget作为底部容器 - 1. 父窗口FramelessWindow设置为背景透明,但是需要绘制一定宽度的透明度很高的矩形边框用来接受鼠标事件(变形鼠标样式进行调整窗口大小) - 1. TitleBar的最小化最大化关闭等按钮事件关联到父窗口里 - 1. TitleBar中的鼠标按下移动事件得到坐标也传递到父窗口调用move方法进行窗口移动 + 1. 使用一个`QWidget`(`FramelessWindow`)作为父窗口, 一个`TitleBar`作为标题栏, 一个`QWidget`作为底部容器 + 1. 父窗口`FramelessWindow`设置为背景透明,但是需要绘制一定宽度的透明度很高的矩形边框用来接受鼠标事件(变形鼠标样式进行调整窗口大小) + 1. `TitleBar`的最小化最大化关闭等按钮事件关联到父窗口里 + 1. `TitleBar`中的鼠标按下移动事件得到坐标也传递到父窗口调用move方法进行窗口移动 ![截图](ScreenShot/无边框自定义标题栏窗口/无边框自定义标题栏窗口.gif) 1. 方式二(windows api) - 1. 使用win32gui设置薄边框 - 1. 重写nativeEvent事件拦截边框的系统边框的显示,并返回各个方向 + 1. 使用`win32gui`设置薄边框 + 1. 重写`nativeEvent`事件拦截边框的系统边框的显示,并返回各个方向 ## 截图 ![截图](ScreenShot/无边框自定义标题栏窗口/win无边框调整大小1.jpg) diff --git a/菜单/README.md b/菜单/README.md index f1bdcd6..06eb299 100644 --- a/菜单/README.md +++ b/菜单/README.md @@ -12,10 +12,10 @@ 原理: -1. 设置菜单项可勾选:通过QAction.setCheckable(True)方法实现 -1. 设置菜单不可关闭:通过覆盖QMenu的鼠标释放mouseReleaseEvent方法(可直接替换或者通过installEventFilter安装事件过滤器实现) -1. 在菜单的鼠标释放事件中,当点击菜单项后是通过点击点坐标来查找是否有QAction,然后触发对应的QAction。
-1. 故在没有QAction的地方则直接交还给QMenu自行处理逻辑,在有QAction的地方可以根据自己的需求进行处理(如上所提) +1. 设置菜单项可勾选:通过`QAction.setCheckable(True)`方法实现 +1. 设置菜单不可关闭:通过覆盖`QMenu`的鼠标释放`mouseReleaseEvent`方法(可直接替换或者通过`installEventFilter`安装事件过滤器实现) +1. 在菜单的鼠标释放事件中,当点击菜单项后是通过点击点坐标来查找是否有`QAction`,然后触发对应的`QAction` +1. 故在没有`QAction`的地方则直接交还给`QMenu`自行处理逻辑,在有`QAction`的地方可以根据自己的需求进行处理(如上所提) 核心代码: diff --git a/表格/QTableView/README.md b/表格/QTableView/README.md index ef18092..16cf747 100644 --- a/表格/QTableView/README.md +++ b/表格/QTableView/README.md @@ -3,7 +3,7 @@ ## [1、表格内容复制](表格内容复制.py) 1. 通过构造一个和选中区域一样的空数组,然后对数组进行填充形成表格 -1. 最后循环数组用\t进行拼接join,换行用\r\n +1. 最后循环数组用`\t`进行拼接`join`,换行用`\r\n` 1. 把字符串复制到剪切板中 ![截图](ScreenShot/表格内容复制1.png)![截图](ScreenShot/表格内容复制2.png) diff --git a/表格/QTableWidget/README.md b/表格/QTableWidget/README.md index f801e81..cbded33 100644 --- a/表格/QTableWidget/README.md +++ b/表格/QTableWidget/README.md @@ -2,6 +2,6 @@ [1、Sqlalchemy动态拼接字段查询显示表格](数据库查询显示表格) -通过判断界面中选择的条件对Sqlalchemy的model进行字段拼接从而实现按条件查询 +通过判断界面中选择的条件对`Sqlalchemy`的`model`进行字段拼接从而实现按条件查询 ![截图](数据库查询显示表格/ScreenShot/数据库查询显示表格.png) \ No newline at end of file