升级wxWidgets 3.1.5后wxRendererNative::Get调用失效问题
问题根因
旧代码在wxWidgets 3.1及以上版本编译失败的核心原因是类的拷贝限制变更:
- 新版本中
wxDelegateRendererNative通过wxDECLARE_NO_COPY_CLASS宏显式禁用了拷贝构造函数和拷贝赋值运算符,不允许通过值拷贝的方式创建实例 - 原代码使用
wxDelegateRendererNative rn = wxRendererNative::Get();的拷贝初始化语法,会触发被禁用的拷贝构造函数,直接抛出编译错误 - 旧版wxWidgets未对该类做拷贝限制,因此原代码在旧版本下可以正常编译运行
修复方案
只需要修改myVListBox构造函数中获取渲染器实例的代码即可,不需要改动其他业务逻辑:
- 找到构造函数开头的错误行:
wxDelegateRendererNative rn = wxRendererNative::Get();
- 将其替换为引用方式获取全局原生渲染器实例:
wxRendererNative& rn = wxRendererNative::Get();
修改后所有后续对rn的GetCheckBoxSize、DrawCheckBox调用都可以正常执行,渲染效果和原逻辑完全一致,不会产生行为差异。
补充说明:原代码中实例化
wxDelegateRendererNative本身属于非必要写法,该类的设计用途是实现自定义渲染器的委托转发,仅使用原生系统渲染能力时,直接获取全局渲染器实例的引用是官方推荐的标准写法。
内容的提问来源于stack exchange,提问作者user19414420
相关产品推荐
相关产品推荐

