说一说Qt编程中的常见坑点
非AI生成觉得有用就请您帮忙点赞转发收藏吧您的鼓励是我创作的动力多谢看官。在日常Qt编程中难免会碰到各种奇怪的问题很大概率是我们没有遵守Qt的一些规矩想用好Qt就必须严格遵守这些规矩不然坑点优点多啊。一、内存与对象树管理父子关系误用new的对象设了 parent又手动 delete导致重复释放崩溃或没设 parent又忘了 delete造成内存泄漏。栈对象挂父链把函数内局部栈对象QObject子类设给需要长期存在的父对象函数返回后父对象析构访问野指针崩溃。QNetworkReply 泄漏QNetworkAccessManager发出的 finished信号返回的 QNetworkReply*不会自动释放必须手动 deleteLater()。智能指针混用QPointer弱引用观测已销毁对象未判空QSharedPointer与裸指针混用导致重复释放或泄漏。隐式共享COW多线程坑QString/QList等隐式共享容器在多线程同时“写”时可能触发意外深拷贝甚至数据竞争。二、信号槽机制旧宏语法静默失败SIGNAL()/SLOT()宏在运行时才检查拼错名字或参数不匹配不报错但槽不执行Qt5 新函数指针语法能在编译期检查更安全。参数类型不匹配跨线程时自定义类型未用 qRegisterMetaType()注册连接失败或运行时警告。Lambda 捕获悬空指针Lambda 中用 [this]或 []捕获若对象已析构仍可能回调访问野指针应配合 QPointer或在 disconnect时清理。连接类型选错跨线程默认 AutoConnection有时被误以为是直连实则队列连接导致执行时序不符合预期BlockingQueuedConnection用在同线程会死锁。一个信号连多个槽顺序执行顺序与 connect顺序一致但重构后容易忽略依赖关系引发逻辑问题。三、多线程与事件循环子线程操作 UI在非主线程直接操作 QWidget、QPixmap等 GUI 类随机崩溃报 QPixmap: It is not safe...。QThread 使用误区继承 QThread重写 run()却在 run()里创建/操作 UI或没调用 exec()启动事件循环导致队列信号槽不生效。线程亲和性乱改moveToThread()后在不恰当时机调用或在对象已有事件处理时频繁切换线程。sleep 阻塞事件循环在含事件循环的线程里用 QThread::sleep()会卡住定时器、信号槽分发。processEvents 重入坑手动调用 QApplication::processEvents()可能导致嵌套事件处理如重入槽函数引发状态不一致甚至栈溢出。共享资源未同步多线程访问同一 QObject或非线程安全库只用简单锁但检查与操作非原子性。数据库连接不能跨线程每个线程需独立 QSqlDatabase连接跨线程共享会崩溃。四、事件系统重写事件不调基类重写 resizeEvent、paintEvent等忘了 QWidget::xxxEvent(event)导致布局或默认行为丢失。mouseMoveEvent 不触发没设 setMouseTracking(true)默认只有鼠标按下才发移动事件。键盘事件无焦点Widget 没设 setFocusPolicy(Qt::StrongFocus)且没 setFocus()键盘事件被其他控件吃掉。事件过滤器不判对象eventFilter()里没先判断 watched和 event-type()逻辑误作用于无关控件。sendEvent/postEvent 混淆sendEvent同步且在栈上分配事件postEvent异步在堆上且自动删除跨线程只能用后者。五、UI、样式与跨平台主线程耗时卡 UI在按钮槽函数里跑大循环/密集计算事件循环被堵界面假死。样式表覆盖代码设置Qt 样式表优先级高于代码中 setFont/setPalette等导致代码样式“失效”。复杂样式表性能差大量控件嵌套复杂 QSS界面初次显示或 resize 时卡顿。布局嵌套过深重绘和尺寸计算开销大容易卡顿。DPI 缩放不全只开了 AA_EnableHighDpiScaling但自定义控件没重写 sizeHint/minimumSizeHint在高分屏显示异常。字体渲染跨平台差异Windows/Linux/macOS 字体字号渲染不同界面错位或模糊。中文乱码源码编码、编译器执行字符集、QString::fromLocal8Bit使用不当导致乱码建议统一 UTF-8 并设编译器 /utf-8或对应选项。QPixmap/QImage 混用坑QPixmap针对屏幕优化不可跨线程QImage才是纯数据处理用搞反容易崩或显示异常。资源文件 qrc 修改需重编qrc 编译进可执行文件改了资源图片不重新编译看起来“没生效”。六、环境、构建与发布中文路径问题Qt 安装目录、项目源码路径含中文可能导致 moc、uic、编译或运行时诡异错误开发阶段建议全英文路径。Q_OBJECT 宏忘加自定义 QObject子类用了信号槽/属性但未在头文件加 Q_OBJECTmoc 不生成元对象代码connect 失败或运行时崩溃。.pro 文件漏写模块Qt5 需手动 QT widgets/core/network/sql等漏写对应头文件找不到。windeployqt 漏拷依赖Windows 发布少拷 DLL、VC 运行时、OpenSSL 等客户机报缺 dllLinux/macOS 同样有 ldd依赖和 macdeployqt签名问题。版本与编译器不兼容插件与主程序 Qt 版本、编译器MSVC/GCC/MinGW不一致插件加载失败升级 Qt 版本行为微调未测出坑。第三方库 ABI 不匹配Debug/Release、32/64 位、CRT 类型不一致链接或运行崩溃。