QWindowsBackingStore::flush: GetDC failed (句柄无效。)

本文介绍了一种解决Qt应用程序中使用VS2015进行频谱绘制时,实时更新的文字偶尔消失的问题。通过调整字体选择和释放方式,避免了因资源管理不当导致的GUI对象持续增加及文字消失的现象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天使用VS2015开发Qt项目做绘制频谱功能,发现实时改变的文字(红圈中文字)会在一段时间后消失。
这里写图片描述

问题代码部分

代码块语法遵循标准markdown代码,例如:

void DLText::BuildFont()
{
    HFONT font = CreateFont(
        -m_iFontSize,/*高度*/
        m_iFontSize,/*宽度*/
        0,/*不用管*/
        0,/*不用管*/
        FW_NORMAL, /*一般这个值设为400*/
        FALSE,/*不带斜体*/
        FALSE,/*不带下划线*/
        FALSE,/*不带删除线*/
        DEFAULT_CHARSET, //这里我们使用默认字符集,还有其他以 _CHARSET 结尾的常量可用
        OUT_CHARACTER_PRECIS, 
        CLIP_CHARACTER_PRECIS, //这行参数不用管
        DEFAULT_QUALITY, //默认输出质量
        FF_DONTCARE, //不指定字体族*/
        m_strFontName.toStdWString().c_str()//字体名
    );
    SelectObject(m_HDC, font);                          //选择字体
    DeleteObject(font);
}
其中m_HDC是DC的句柄.
当红色范围内的文字消失后就会报错,并打印错误信息
QWindowsBackingStore::flush: GetDC failed (句柄无效。)
或者
QWindowsBackingStore::flush: GetDC failed ()
看看任务管理器打开GUI选项,GUI对象一直增加

这里写图片描述
解决办法就是最后两行改为
HFONT oldFont = (HFONT)SelectObject(m_HDC, font);
DeleteObject(font);
DeleteObject(oldFont);

### 解决连接数据库时 `fetch` 失败的问题 当遇到连接 MySQL 数据库过程中 `fetch` 操作失败的情况,通常可能是由于以下几个原因引起: #### 1. 驱动版本不兼容 如果使用的驱动程序与 MySQL 版本不符,则可能导致各种异常行为。确保所使用的 JDBC 或其他类型的驱动器是最新的,并且适用于当前的 MySQL 版本[^2]。 #### 2. 认证插件问题 某些情况下,默认认证方式可能造成客户端无法正常访问服务器。对于较新版本的 MySQL 默认采用 `caching_sha2_password` 插件作为身份验证机制,在这种情形下可以尝试修改用户的密码加密算法为更普遍接受的形式,比如通过执行 SQL 命令更改 root 用户的身份验证方法至 `mysql_native_password`: ```sql ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'yourpassword'; FLUSH PRIVILEGES; ``` 这一步骤有助于绕过因认证协议不同而导致的一系列潜在障碍。 #### 3. 编译链接错误处理 针对编译阶段可能出现的类似于 `libmysql.lib : fatal error LNK1113: invalid machine type` 的情况,建议确认开发环境中的平台目标(如 x86/x64),并下载相应架构下的 MySQL Connector/C 库文件来匹配 Visual Studio 设置。此外,还需注意项目属性里的链接器输入项是否已正确添加 `.lib` 文件路径以及依赖 DLL 是否存在于系统的 PATH 环境变量中[^3]。 #### 4. URL 和 Driver Class 名称准确性 检查应用程序配置文件里指定的数据源 URL 及驱动类名是否准确无误。例如,在 Java 中使用 JDBC 连接到 MySQL 数据库的标准形式如下所示: ```java String url = "jdbc:mysql://hostname:port/databaseName"; String driverClassName = "com.mysql.cj.jdbc.Driver"; // 对于最新版 MySQL 使用此驱动名称 Class.forName(driverClassName); Connection conn = DriverManager.getConnection(url, username, password); ``` 确保以上参数均按照实际情况进行了适当调整[^4]。 #### 5. 资源释放不当引发的 Fetch Failed 错误 另一个常见的原因是未及时关闭 Statement 或 ResultSet 导致资源泄露,从而影响后续查询操作的结果获取。因此应当养成良好的编程习惯,在完成数据读取之后立即调用 close 方法释放相关对象,防止此类状况发生。 综上所述,要彻底解决问题需逐一排查上述可能性,并采取相应的措施加以修正。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值