QSystemTrayIcon::showMessage 导致CreateDIBSection failed (1658x1026, format: 6)

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)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值