-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlog.txt
108 lines (79 loc) · 6.62 KB
/
log.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
1.关于只缩放显示部分:由于缩小到原片后可能导致像素不足,导致长宽比变化,暂时放弃该方案
(且,可以优化但没必要(原原方案效率还行))
2.无边框窗口 貌似最大化无效 必须自己写(处理任务栏无法触发问题(任务栏隐藏时));so Height -1px
(可能在全屏时 任务栏自动消失(而非覆盖))
3.增加pixmap 阴影 with QGraphicsScene
优化:像素值过大时 取消阴影渲染(减少卡顿)
4.破案了 透明窗体 会让mouseMoveEvent卡顿(与其Size有关)
不是paintEvent()频率低(>100)而是检测鼠标移动的频率低
#Solve:通过设置窗口Mask的方法解决(减少透明面积 也许mask之外的不算渲染)
但会有残影:通过增加extend解决
↑Nonono 未触及根本 :update并非实时生效,所以setMask得放在paintEvent中确保Mask & painter同时生效
同时在setMask前clearMask(); //防止mask更新不及时 导致显示不完全
5.给控件添加QGraphicsDropShadowEffect:在坐标为负时报错,所以先生成阴影pixmap再显示图片
6.##自己paintEvent绘制 无优化 CPU占用很高,改用QLabel作为载体 并设置鼠标穿透 让主窗体接收鼠标事件
采用现有控件后,mouseMoveEvent卡顿也迎刃而解,应该是有优化
不过绘制复杂图形 最好还是采用QGraphicSense or QOpenGL,自己绘制将会出问题
7.自行paintEvent时,setMask可以减轻CPU压力(即便背景透明)
但是不要频繁setMask 还是会增大CPU占用
8.任务栏缩略图 失败:与无边框窗口冲突 导致效果不佳
9.研读Windows API文档 + Qt源码 再次尝试
发现Qt在调用setIconicThumbnailPixmap->DwmSetIconicThumbnail()时默认使用DWM_SIT_DISPLAYFRAME参数,在缩略图周围显示frame导致错位,且未提供修改参数
只能自行调用Windows API对此处进行替换
但是由于版本问题被屏蔽:在头文件中加入#define WINVER 0x0A00 #define _WIN32_WINNT 0x0A00
但但是又undefined reference:缺少链接库 在.pro文件中加入 LIBS += -lDwmapi -lGdi32
但但但是又不显示缩略图:大小有限制(在nativeEvent的参数lparam中,但是由于QWinThumbnailBar拦截了事件导致无法得到,只能采用retry 试出最佳Size)
但是 由于手动枚举Size太慢 导致显示空白,所以一开始手动调用setThumbnailPixmap 寻找最佳size
但是 手动枚举什么的 太low了 打倒Qt暴政 还我Native Event
所以多继承QAbstractNativeEventFilter 安装filter 获取第一手情报(后安装的先获取 所以要在QWinThumbnailBar构造之后)
直接获取WM_DWMSENDICONICTHUMBNAIL消息 得到maxSize
(保证windows.h中的版本定义被修改 头文件放第一个)
10.QtWinThumbnailToolBar原理:
Native事件交给单独的QWinThumbnailToolBarPrivate类(继承自QAbstractNativeEventFilter)处理,本体持有其指针
接收到Native事件后,开始更新缩略图(如果用setIconicThumbnailPixmap设置过的话)
并emit iconicThumbnailPixmapRequested供用户更新缩略图
如果要调用Windows API手动设置缩略图 就不能调用setIconicThumbnailPixmap否则会被覆盖
setIconicLivePreviewPixmap不进行实际更新
实际更新在Native Event时updateIconicLivePreview()
所以我们在接收事件时必须往下传递,不能return true,否则没有代码去实现LivePreview了
#其实根本没有必要重写与拦截LivePreview事件,用原生的就行
#重写Thumbail就行
11. 新增Gif支持:
只改了updateAll & setPixmap
12.
movie->setScaledSize(pixRect.size());//缩放延迟
遂还是采用 QLabel->scaleContents()//但是这玩意儿 会影响setPixmap效率 所以只在isGif开启
&GUI部件,如ui->label->setPixmap不能在非GUI线程使用,会出问题(特别是多线程),最好发射信号 在GUI线程处理//采用 Qt::QueuedConnection connect
注:如果多线程多次执行某操作耗时巨长,可以检测自己是否是最后一个(唯一一个线程),如果是才执行 来减轻负担(也就是同时多次处理合并)
13.自动设置文件关联失败 存在众多键值 UserChoice优先级最高 但有hash值无法计算(建议手动右键设置关联)
14.QtConcurrent::run()开启子线程写在前(GUI thread 0ms) 可以更好的并行计算,提升效率
15.使用多线程加载图片with QImageReader 优化加载速度
16.尝试文件关联再次失败
半成品:会在第一次启动时被识别为新App并出现在打开方式备选菜单
17.在文件夹边缘切换图片 不再重新加载
多线程加载fileList
Ctrl+滚轮切换图片
高DPI适配(右键菜单间距)
18.引入枚举值 增加switchPixmap可读性
增加signal 请求&关闭Menu 增加可读性 & 拓展性
增加版本信息(同菜单一同呼出(右下角))
19.检测TaskBar 修复了Version信息被TaskBar遮挡的问题
20.新增旋转并保存
21.调整右键菜单btns高度间距计算 视觉上更统一
22.构造完成后 setFocus 否则首次按键不响应(第二次响应 就很神奇)
23.新增自动旋转,根据图片的EXIF信息自动调整图片的方向,包括旋转和翻转
24.新增Ctrl+C复制图片到剪贴板
BUG: 1. 只能复制GIF的第一帧(正常) 其他软件也是如此(要么就是复制为路径)
2. PNG透明背景变白(正常)(Windows照片查看器也是如此)
3. Ctrl+C有时触发失败
4. QQ有时粘贴时卡住(Win+V打开历史记录的时候)(应该是QQFollower hook的问题)
25.新增相对于某窗口置顶功能(WinEventHook)
// 技术简析:https://blog.cls.ink/2024/06/16/Windows%E7%AA%97%E5%8F%A3-%E7%9B%B8%E5%AF%B9%E7%BD%AE%E9%A1%B6-%E6%8A%80%E6%9C%AF%E7%AE%80%E6%9E%90/
26.文件关联:修改exe文件内容(如描述、图标等)不会刷新Windows缓存,导致不生效,各种清理缓存策略均无效,无奈只能修改exe文件名
表现型为:右键png图片-打开方式:显示的是旧的描述信息(ImageViewer_2.exe),但是在资源管理器中显示的是新的(ImageViewer 2.0)
到底缓存在哪里呀 aaa
!!! 我焯 找到了 :HKEY_CLASSES_ROOT\Local Settings\Software\Microsoft\Windows\Shell\MuiCache
or HKEY_CURRENT_USER\Software\Classes\Local Settings\Software\Microsoft\Windows\Shell\MuiCache
GPT-4o给力!(虽然问了很多次)
& https://blog.csdn.net/wsadcg/article/details/116886653
BUT,QSettings无法处理包含'\'(路径分隔符)的键名,所以只能用 Windows API