Qt CreateDIBSection failed (1658x1026, format: 6)
报错信息
Qt CreateDIBSection failed (1658x1026, format: 6)
原因
代码中调用了 QSystemTrayIcon::showMessage 方法,该方法创建了GDI对象但未释放。
随着调用次数增加,GDI对象到达上限程序就闪退了。(类似于内存泄漏,但是是GDI对象泄露)
参考 https://bugreports.qt.io/browse/QTBUG-62945
坑爹的是这个bug从2017到现在Qt还没修复!
(截至2023-10-20我下载的最新Qt5&Qt6都还有这个问题)
解决方案
1. 修掉bug
按照如下自行修改qt源码 再自己编译qt (pyqt用户表示很吐血。。。)
--- qsystemtrayicon_win.cpp 2017-07-09 15:28:00.000000000 +0300
+++ qsystemtrayicon_win.cpp.patched 2017-09-01 20:24:21.054096700 +0300
@@ -278,7 +278,10 @@
tnd.uTimeout = uSecs;
tnd.uFlags = NIF_INFO | NIF_SHOWTIP;
- return Shell_NotifyIcon(NIM_MODIFY, &tnd);
+ BOOL res = Shell_NotifyIcon(NIM_MODIFY, &tnd);
+ if(*phIcon)
+ DestroyIcon(*phIcon);
+ return res;
}
bool QSystemTrayIconSys::trayMessage(DWORD msg)
2. 规避有bug的showMessage方法
- 要么不用这个方法,自己另行实现
- 参数改成使用icon=NoIcon
QSystemTrayIcon.showMessage(title, content, QSystemTrayIcon.MessageIcon.NoIcon, 1000)